在 Firestore 中更新数据时,ItemBuilder 不会在 StreamBuilder 中执行
Itembuilder doesn't execute in streambuilder, when updating data in firestore
当我第一次启动该应用程序时,它会将所有项目加载到动画列表中。但是当我将一个项目添加到 firestore 时,streambuilder 意识到发生了一些事情。但它不执行 itembuilder,因此不会显示新项目。但是,如果我重新启动该应用程序,将加载新项目。如果我只是更改 firestore 数据库中现有项目的名称,它将毫无问题地重建。
当我更新一个项目时。我必须获取任务地图并将其替换为包含该项目的新副本,post/update 要 firestore。
我已经尝试了所有我能想到的,不明白为什么会这样。
我已经在 itembuilder 中打印,可以看到它不会在更新时执行。
Widget _buildTasksList() {
return new Expanded(
child: new StreamBuilder(
stream: Firestore.instance
.collection("lists")
.document(tasklist.postID)
.snapshots(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (!snapshot.hasData) {
return new Text("Loading");
}
var listdata = snapshot.data;
tasklist.tasks = listdata['tasks'];
tasklist.owners = listdata['owners'];
tasklist.sorter = listdata['sorter'];
return new AnimatedList(
initialItemCount: convertToTaskList(listdata['tasks']).length,
key: _listKey,
itemBuilder: (context, index, animation) {
return new TaskRow(
task: this.listModel[index],
animation: animation,
listModel: this.listModel,
tasklist: tasklist,
onChange: () => _onChange(this.listModel[index]),
);
},
);
},
)
);
}
通过重置我的 _listKey 让它工作,在动画列表之前添加它。
_listKey = 空;
_listKey = new GlobalKey();
当我第一次启动该应用程序时,它会将所有项目加载到动画列表中。但是当我将一个项目添加到 firestore 时,streambuilder 意识到发生了一些事情。但它不执行 itembuilder,因此不会显示新项目。但是,如果我重新启动该应用程序,将加载新项目。如果我只是更改 firestore 数据库中现有项目的名称,它将毫无问题地重建。
当我更新一个项目时。我必须获取任务地图并将其替换为包含该项目的新副本,post/update 要 firestore。
我已经尝试了所有我能想到的,不明白为什么会这样。 我已经在 itembuilder 中打印,可以看到它不会在更新时执行。
Widget _buildTasksList() {
return new Expanded(
child: new StreamBuilder(
stream: Firestore.instance
.collection("lists")
.document(tasklist.postID)
.snapshots(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (!snapshot.hasData) {
return new Text("Loading");
}
var listdata = snapshot.data;
tasklist.tasks = listdata['tasks'];
tasklist.owners = listdata['owners'];
tasklist.sorter = listdata['sorter'];
return new AnimatedList(
initialItemCount: convertToTaskList(listdata['tasks']).length,
key: _listKey,
itemBuilder: (context, index, animation) {
return new TaskRow(
task: this.listModel[index],
animation: animation,
listModel: this.listModel,
tasklist: tasklist,
onChange: () => _onChange(this.listModel[index]),
);
},
);
},
)
);
}
通过重置我的 _listKey 让它工作,在动画列表之前添加它。 _listKey = 空; _listKey = new GlobalKey();