Flutter 未来生成器将长度返回为null

Flutter 未来生成器将长度返回为null,flutter,google-cloud-firestore,Flutter,Google Cloud Firestore,我正在从CloudFireStore检索数据,并使用Future builder和Listview builder显示数据。但是我在Listview生成器中得到了空值,即始终显示CircularProgressIndicator。我无法解决问题。任何解决方案都会有很大帮助 print(values)函数成功打印出:[9,8] 这是我实现的代码: Future<List> getassignment() async { SharedPreferences prefs = awa

我正在从CloudFireStore检索数据,并使用Future builder和Listview builder显示数据。但是我在Listview生成器中得到了空值,即始终显示CircularProgressIndicator。我无法解决问题。任何解决方案都会有很大帮助

print(values)函数成功打印出:[9,8]

这是我实现的代码:

Future<List> getassignment() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    final name = prefs.getString('orgname') ?? '';
    print(name);
    

      var query = FirebaseFirestore.instance.collection('Org').doc(name).collection('Login').doc(FirebaseAuth.instance.currentUser.uid);
    query.snapshots().forEach((doc) {

    List values = List.from(doc.data()['fields']['class']);
    print(values);
    return values;

    });

  }

  // void getlist() async{
  //   await getassignment();
  // }       

  @override
  void initState() {
    
    // getlist();
    super.initState();
  }

  

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Color(0xFF1976D2),
      body: FutureBuilder(
        future: getassignment(),
        builder: (context,snapshot){
          List list = snapshot.data;
          if (!snapshot.hasData) {
            return Center(child: CircularProgressIndicator());
         } else{
           return Container(
             child: ListView.builder(
          itemCount: snapshot.data.length,
          itemBuilder: (context, position) {
            return GestureDetector(
              onTap: (){
                Navigator.of(context).push(MaterialPageRoute<Null>(
                                      builder: (BuildContext context){
                                        return new SubjectList(
                                          clas: list[position].toString(),
                                        );
                                      }
                                      ));
              },
              child: Card(
                
                child: Padding(
                  padding: const EdgeInsets.all(16.0),
                  child: Text(list[position].toString(), style: TextStyle(fontSize: 22.0),),
                  
                ),
              ),
            );
          },
        ),
           );
         }
        },
              
      ),
    );
  }
 
Future getassignment()异步{
SharedReferences prefs=等待SharedReferences.getInstance();
最终名称=prefs.getString('orgname')??“”;
印刷品(姓名);
var query=FirebaseFirestore.instance.collection('Org').doc(name).collection('Login').doc(FirebaseAuth.instance.currentUser.uid);
query.snapshots().forEach((doc){
列表值=List.from(doc.data()['fields']['class']);
打印(值);
返回值;
});
}
//void getlist()异步{
//等待getassignment();
// }       
@凌驾
void initState(){
//getlist();
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
背景颜色:颜色(0xFF1976D2),
正文:未来建设者(
future:getassignment(),
生成器:(上下文,快照){
List=snapshot.data;
如果(!snapshot.hasData){
返回中心(子项:CircularProgressIndicator());
}否则{
返回容器(
子项:ListView.builder(
itemCount:snapshot.data.length,
itemBuilder:(上下文、位置){
返回手势检测器(
onTap:(){
导航器.of(上下文).push(MaterialPageRoute(
生成器:(BuildContext上下文){
返回新的主题列表(
clas:list[position].toString(),
);
}
));
},
孩子:卡片(
孩子:填充(
填充:常数边集全部(16.0),
子项:文本(列表[position].toString(),样式:TextStyle(fontSize:22.0)),
),
),
);
},
),
);
}
},
),
);
}

您正在foreach循环内部分配和返回数据。这样就不会有任何回报了

// try adding await in this line.
var query = await FirebaseFirestore.instance.collection('Org').doc(name).collection('Login').doc(FirebaseAuth.instance.currentUser.uid);

List values = query.snapshots().forEach((doc) => List.from(doc.data()['fields']['class']));

print(values);
return values;

您需要这样做。

返回值是未来。我通过初始化将来的值来尝试上面的代码。但它仍然会给出一个error,即不能将“Future”类型的值分配给“List”类型的变量。它现在给出了这个错误。我有疑问地添加了它,这是未来的构建价值,而不是你的firestore价值。。。这意味着FirebaseAuth.instance.collection('Org').doc(name.collection('Login').doc(FirebaseAuth.instance.currentUser.uid)的返回值是多少;这是一份参考文件。。。。所以它将类似于这个文档引用(Org/Org 2/Login/BxdGMpUjJOXKjg9asD8CCrqViJT2)