Android 生成函数返回null-FutureBuilder

Android 生成函数返回null-FutureBuilder,android,flutter,dart,Android,Flutter,Dart,我对此有点困惑,因为我的future builder应该在等待未来时返回一个循环进度指示器。它以前工作过,但我一直在更改内容,但没有作出承诺,因此无法检查我更改了什么 未来的建设者: Container( child: Row( mainAxisSize: MainAxisSize.max, children: <Widget>[ FutureBuilder

我对此有点困惑,因为我的future builder应该在等待未来时返回一个循环进度指示器。它以前工作过,但我一直在更改内容,但没有作出承诺,因此无法检查我更改了什么

未来的建设者:

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. 
}