从Firebase检索后,Flutter setState函数不会更新列表。
我正在尝试开发Flutter应用。我没有在setState()函数中更新列表。该列表已成功从Firebase检索。我已将Firebase连接写在Services.dart
文件中。
但是我的方法_getList()
没有在main.dart
文件中获取值。
main.dart
class DetailsPageState extends State<DetailsPage> {
List<Product> list;
@override
void initState() {
_checkUser(); // for getting user id from firebase auth
}
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Container(
child:new Text("data");
);
)
}
void _checkUser(){
debugPrint("Entering in _checkUser");
this.firebaseAuth.onAuthStateChanged.listen((firebaseUser)async{
_getList(firebaseUser.uid);
});
}
void _getList(String id)
debugPrint("Entering in _getList");
Services.retrieveItems(firestore, uid).then((onValue){
setState(() {
list=onValue;
debugPrint("items list:"+onValue.length.toString());
debugPrint("items list:"+listCart.length.toString());
});
});
}
}
Services.dart
static Future<List> retrieveItems(Firestore firestore, String userId) async {
List<Product> items = new List<Product>();
try {
firestore.collection("Items").document(userId)
.collection("ItemsMain").snapshots().listen((QuerySnapshot snapshot) {
List docList = snapshot.documents;
items = snapshot.documents.map((documentSnapshot) => Product.fromMap(documentSnapshot.data)).toList();
debugPrint("items:"+items.length.toString());
//return items;
});
} on Exception catch (e) {
print (e.toString());
}
debugPrint("items 2:"+items.length.toString());
return items;
}
预期结果:
输入_checkUser
输入_getList
项目:6
项目2:6
商品列表:6
商品列表:6
实际结果:
输入_checkUser
输入_getList
物品清单:0
物品清单:0
项目2:0
项目:6
答案 0 :(得分:1)
您要在加载项目之前返回它们。解决此问题的最简单方法是在await
中使用retrieveItems
等待从Firestore加载数据:
static Future<List> retrieveItems(Firestore firestore, String userId) async {
List<Product> items = new List<Product>();
var snapshot = await firestore.collection("Items").document(userId)
.collection("ItemsMain").getDocuments()
List docList = snapshot.documents;
items = snapshot.documents.map((documentSnapshot) => Product.fromMap(documentSnapshot.data)).toList();
debugPrint("items:"+items.length.toString());
return items;
}
您会注意到我:
get()
而不是listen()
。由于listen()
开始主动监视集合,因此无法确定何时“完成”。另一方面,get()
仅返回一次文档,然后完成。