Streambuilder 未在 Flutter 中更新
Streambuilder is not updating in Flutter
我正在使用 Streambuilder 并从 firebase 加载快照。加载快照后,我将我的数据放入 Post.dart 我制作小部件结构的地方。我的代码可以获取数据,但是当我从 firebase 中删除 post 之一时,它仍然显示相同的 posts,但最后一个消失而不是删除的那个。但是,如果我更改我的页面并返回,正确的一个被删除,一切都很好。所以我认为 flutter 知道我正在更改我的 firebase,但不知道如何将它映射到我的 Post。有什么想法吗?
StreamBuilder(
stream: FirebaseFirestore.instance
.collection("timeline")
.doc(widget.currentUser.id)
.collection('timelinePosts')
.orderBy('timestamp', descending: true)
.snapshots()
builder: (BuildContext context,
AsyncSnapshot<QuerySnapshot> streamSnapshot) {
var items = streamSnapshot.data != null &&
streamSnapshot.data.docs != null
? streamSnapshot.data.docs
: [];
List<Post> posts =
items.map((doc) => Post.fromDocument(doc)).toList();
return !streamSnapshot.hasData ||
streamSnapshot.connectionState ==
ConnectionState.waiting
? Center(
child: CircularProgressIndicator(),
)
: Column(
children: posts);
})
和Post类似于
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
...
],
);
}
您需要为您的 post 项目小部件提供一个唯一的键,以便在 flutter 重建列时,它能够区分旧的 post 和 [= 的新列表17=]秒。基本上它与 flutter 如何决定重建某些元素以及何时重建有关。
如果你想测试一个唯一的键是否可以解决问题,我通常首先将这样的键分配给 post 小部件:
key: Key("${Random().nextDouble()}"),
看看这是否改变了什么。如果它修复了它,您可以尝试更有效的键,例如每个元素的属性组合。
我可能有点晚才放弃我的 2 美分,但您可以尝试将此代码添加到您的 Post 小部件:
@override
void didUpdateWidget(Post oldWidget) {
//add the code you want it to update inside your Post widget.
super.didUpdateWidget(oldWidget);
}
我正在使用 Streambuilder 并从 firebase 加载快照。加载快照后,我将我的数据放入 Post.dart 我制作小部件结构的地方。我的代码可以获取数据,但是当我从 firebase 中删除 post 之一时,它仍然显示相同的 posts,但最后一个消失而不是删除的那个。但是,如果我更改我的页面并返回,正确的一个被删除,一切都很好。所以我认为 flutter 知道我正在更改我的 firebase,但不知道如何将它映射到我的 Post。有什么想法吗?
StreamBuilder(
stream: FirebaseFirestore.instance
.collection("timeline")
.doc(widget.currentUser.id)
.collection('timelinePosts')
.orderBy('timestamp', descending: true)
.snapshots()
builder: (BuildContext context,
AsyncSnapshot<QuerySnapshot> streamSnapshot) {
var items = streamSnapshot.data != null &&
streamSnapshot.data.docs != null
? streamSnapshot.data.docs
: [];
List<Post> posts =
items.map((doc) => Post.fromDocument(doc)).toList();
return !streamSnapshot.hasData ||
streamSnapshot.connectionState ==
ConnectionState.waiting
? Center(
child: CircularProgressIndicator(),
)
: Column(
children: posts);
})
和Post类似于
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
...
],
);
}
您需要为您的 post 项目小部件提供一个唯一的键,以便在 flutter 重建列时,它能够区分旧的 post 和 [= 的新列表17=]秒。基本上它与 flutter 如何决定重建某些元素以及何时重建有关。
如果你想测试一个唯一的键是否可以解决问题,我通常首先将这样的键分配给 post 小部件:
key: Key("${Random().nextDouble()}"),
看看这是否改变了什么。如果它修复了它,您可以尝试更有效的键,例如每个元素的属性组合。
我可能有点晚才放弃我的 2 美分,但您可以尝试将此代码添加到您的 Post 小部件:
@override
void didUpdateWidget(Post oldWidget) {
//add the code you want it to update inside your Post widget.
super.didUpdateWidget(oldWidget);
}