Android 生成函数返回null-FutureBuilder
我对此有点困惑,因为我的future builder应该在等待未来时返回一个循环进度指示器。它以前工作过,但我一直在更改内容,但没有作出承诺,因此无法检查我更改了什么 未来的建设者:Android 生成函数返回null-FutureBuilder,android,flutter,dart,Android,Flutter,Dart,我对此有点困惑,因为我的future builder应该在等待未来时返回一个循环进度指示器。它以前工作过,但我一直在更改内容,但没有作出承诺,因此无法检查我更改了什么 未来的建设者: Container( child: Row( mainAxisSize: MainAxisSize.max, children: <Widget>[ FutureBuilder
Container(
child: Row(
mainAxisSize: MainAxisSize.max,
children: <Widget>[
FutureBuilder(
future: BooruSelector(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.done){
return snapshot.data;
} else {
return Center(child: CircularProgressIndicator());
}
},
),
FlatButton(
onPressed: (){
if(selectedBooru != null){
Get.to(booruEdit(selectedBooru,widget.settingsHandler));
}
//get to booru edit page;
},
child: Text("Edit"),
),
],
),
),
容器(
孩子:排(
mainAxisSize:mainAxisSize.max,
儿童:[
未来建设者(
future:BooruSelector(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.connectionState==connectionState.done){
返回快照数据;
}否则{
返回中心(子项:CircularProgressIndicator());
}
},
),
扁平按钮(
已按下:(){
如果(selectedBooru!=null){
Get.to(booruEdit(selectedBooru,widget.settingsHandler));
}
//进入booru编辑页面;
},
子项:文本(“编辑”),
),
],
),
),
未来职能:
Future BooruSelector() async{
await widget.settingsHandler.getBooru();
widget.settingsHandler.booruList.add(new Booru("New"," ","https://i.imgur.com/fGHg4Ul.png"," "));
if (selectedBooru == null){
selectedBooru = widget.settingsHandler.booruList[0];
}
return Container(
child: DropdownButton<Booru>(
value: selectedBooru,
icon: Icon(Icons.arrow_downward),
onChanged: (Booru newValue){
print(newValue.baseURL);
setState((){
selectedBooru = newValue;
});
},
items: widget.settingsHandler.booruList.map<DropdownMenuItem<Booru>>((Booru value){
return DropdownMenuItem<Booru>(
value: value,
child: Row(
children: <Widget>[
Text(value.name),
Image.network(value.faviconURL,),
],
),
);
}).toList(),
),
);
}
Future BooruSelector()异步{
wait widget.settingsHandler.getBooru();
widget.settingsHandler.booruList.add(newbooru(“new”)、“”、“”、https://i.imgur.com/fGHg4Ul.png"," "));
if(selectedBooru==null){
selectedBooru=widget.settingsHandler.booruList[0];
}
返回容器(
孩子:下拉按钮(
值:selectedBooru,
图标:图标(图标。向下箭头),
一旦更改:(Booru newValue){
打印(newValue.baseURL);
设置状态(){
selectedBooru=newValue;
});
},
条目:widget.settingsHandler.booruList.map((Booru值){
返回下拉菜单项(
价值:价值,
孩子:排(
儿童:[
文本(value.name),
Image.network(value.faviconURL,),
],
),
);
}).toList(),
),
);
}
预期结果:将显示一个下拉菜单
实际结果:一个红色大框,表示构建函数返回了null,这是一个有问题的小部件FutureBuilder
日志
I/颤振(6238):══╡ WIDGETS库捕获到异常╞═══════════════════════════════════════════════════════════
I/flatter(6238):以下断言被抛出building FutureBuilder(肮脏,状态:
I/颤振(6238):_FutureBuilderState#75ce1):
I/flatter(6238):构建函数返回null。
I/flatter(6238):有问题的小部件是:
I/颤振(6238):FutureBuilder
I/flatter(6238):构建函数不能返回null。
I/flatter(6238):要返回导致建筑小部件填满可用空间的空白空间,请返回
I/颤振(6238):“容器()。要返回占用尽可能少空间的空白空间,请返回
I/颤振(6238):“集装箱(宽度:0.0,高度:0.0)”。
I/颤振(6238):
I/颤振(6238):导致错误的相关小部件是:
I/颤振(6238):FutureBuilderfile:///home/kannalo/AndroidStudioProjects/loli/lib/main.dart:240:19
I/颤振(6238):
I/flatter(6238):当抛出异常时,这是堆栈:
I/颤振(6238):#0调试WidgetBuilderValue。(包:flatter/src/widgets/debug.dart:280:7)
I/flatter(6238):#1 debugWidgetBuilderValue(包:flatter/src/widgets/debug.dart:301:4)
I/flatter(6238):#2 ComponentElement.performRebuild(包:flatter/src/widgets/framework.dart:4330:7)
I/flatter(6238):#3 Element.rebuild(包:flatter/src/widgets/framework.dart:4053:5)
I/flatter(6238):#4 BuildOwner.buildScope(包:flatter/src/widgets/framework.dart:2532:33)
I/flatter(6238):#5 WidgetsBinding.drawFrame(包:flatter/src/widgets/binding.dart:796:20)
I/flatter(6238):#6渲染器绑定。_handlePersistentFrameCallback(包:flatter/src/rendering/binding.dart:283:5)
I/flatter(6238):#7 SchedulerBinding._invokeFrameCallback(包:flatter/src/scheduler/binding.dart:1109:15)
I/flatter(6238):#8 SchedulerBinding.handleDrawFrame(包:flatter/src/scheduler/binding.dart:1048:9)
I/flatter(6238):#9计划绑定。#手持绘图框架(包:flatter/src/scheduler/binding.dart:964:5)
I/flatter(6238):#13_调用(dart:ui/hooks.dart:260:10)
I/颤振(6238):#14(省道:ui/挂钩。省道:218:3)
I/颤振(6238):(从包dart中删除3帧:异步)
I/颤振(6238):
I/颤振(6238):════════════════════════════════════════════════════════════════════════════════════════════════════
I/flatter(6238):引发了另一个异常:右侧的RenderFlex溢出99677像素。
假设快照。数据
返回一个字符串
,您可以执行以下操作:
if (snapshot.connectionState == ConnectionState.done){
return Text(snapshot.data ?? "No data"); // you need to return a widget from here.
}
返回一个
小部件
而不是快照。数据
完成后。@Doc我刚注意到你将其作为注释添加,请随意写下来作为答案,我将删除我的。使用Future BooruSelector()
作为签名,然后代替返回快照.data代码>使用返回snapshot.data作为小部件代码>快照数据是一个容器,因为它是从BooruSelector返回的
if (snapshot.connectionState == ConnectionState.done){
return Text(snapshot.data ?? "No data"); // you need to return a widget from here.
}