如何修复此错误:构建FutureBuilder <DataSnapshot>(脏,状态:_FutureBuilderState <DataSnapshot>#89711)时引发了以下断言:

时间:2020-07-03 18:36:02

标签: flutter dart

这是错误:

有问题的小部件是:FutureBuilder 构建函数绝不能返回null。 要返回使建筑物小部件填充可用空间的空白区域,请返回“ Container()”。要返回占用尽可能少空间的空白空间,请返回“ Container(width:0.0,height:0.0)”。

此功能可获取Firebase实时数据:

Future<void> getCategoriesName() async {
   
    await  FirebaseDatabase.instance.reference().child('Categories').once()
        .then((DataSnapshot dataSnapshot){
      var key  = dataSnapshot.value.keys;
      for(var i in key)
      {
        CategoryItems categoryItems =  new CategoryItems(
            dataSnapshot.value[i]['CategoryName'],
            dataSnapshot.value[i]['Counter']
            

        );
        categoryItemList.add(categoryItems);
      }
      setState(() {
        print(categoryItemList.length);
      });

    });
  }

这是我的Future Builder功能:

 Container(
                        margin: EdgeInsets.only(bottom: 50,top: 100),
                        child: FutureBuilder(
                          future: FirebaseDatabase.instance.reference().child('Categories').child(_userPin).once(),
                          // ignore: missing_return
                          builder: (context, snapshot) {
                            if(snapshot.hasData){
                               if (snapshot.data!=null) {
                                return Expanded();
                               }else{
                                 return Loader();
                               }
                          }
                          }
                        ),
                      ),

在扩展中,我有了ListView.builder,上面的错误仅在加载数据时才显示几秒钟,并显示带有项目的屏幕。我在FutureBuiler容器的顶部有堆栈小部件。

1 个答案:

答案 0 :(得分:3)

builder为false时,您似乎没有从snapshot.hasData回调函数返回任何内容。这就解释了为什么直到从数据库中加载数据后您才短暂看到错误。您可以在等待数据从数据库到达的同时,从CircularProgressIndicator回调函数返回一个builder小部件。您还可以摆脱// ignore: missing_return的注释,因为builder回调函数应始终返回小部件。

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(
          margin: EdgeInsets.only(bottom: 50, top: 100),
          child: FutureBuilder(
            future: FirebaseDatabase.instance.reference().child('Categories').child(_userPin).once(),
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                if (snapshot.data != null) {
                  return Expanded();
                } else {
                  return Loader();
                }
              } else {
                return CircularProgressIndicator();
              }
            },
          ),
        ),
      ),
    );
  }
}