我正在开发一个有多个用户的应用程序。我有一个资源列表,这个资源列表就像一个巧克力列表(只有一个和唯一的)。现在,我在所有活跃用户的主屏幕上显示这些巧克力。现在,用户可以点击巧克力,它将被提供给他们。但是,当发生这种情况时,我想刷新所有登录用户,以确保没有两个用户拥有相同的巧克力。
我正在使用数据库触发器来监视数据库中的更改。我能够做到这一点,但我关心的是如何刷新listView。
我的算法如下:
1)监视数据库中的更改。 2)获取新数据集。 3)更新视图
我尝试创建syncDatabaseFunction,如下所示:
Future syncDatabaseFunction() async {
CollectionReference reference = Firestore.instance.collection('Chocolates');
reference.snapshots().listen((querySnapshot){
querySnapshot.documentChanges.forEach((change){
print("Changed Chocolate");
BackendOperations.getAllChocolates().then((value){
var chocolateTemp = (value as List<ChocolateModel>)
.where((element) => (element.chocolateColor == "Brown"))
.toList();
print("Count is ");
return chocolateTemp;
});
});
});
}
对于listview,我使用的是futureBuilder。
我认为,如果你使用StreamBuilder
,你将解决问题。当用户删除或添加为所有用户显示的新评论时。 StreamBuilder
是这样做的,成为流的观察者。
这是我的代码:
Widget getListComment() {
return StreamBuilder<QuerySnapshot>(
stream: Firestore.instance
.collection('comments')
.where('post', isEqualTo: postRef)
.orderBy('createdAt', descending: true)
.snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasError) return new Text('Error: ${snapshot.error}');
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Column(
children: <Widget>[
CircularProgressIndicator(),
],
);
default:
return new ListView(
children:
snapshot.data.documents.map((DocumentSnapshot document) {
return CommentItem(
key: Key(document.documentID),
comment: Comment.fromDoc(document),
myUser: widget.myUser,
);
}).toList(),
);
}
},
);
}
我从Firebase收到评论并在ListView
中显示,我认为这就像你的巧克力。