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