我有一个SQLite数据库,可以从中查询数据。根据这些数据,我创建了必要的小部件并将它们存储在列表中。将列表传递给ListView.builder我从列表中创建项目。除了将新数据添加到小部件列表中外,其他一切看起来都不错。如果我使用.mean()
,则什么也没有显示。如果我使用insert
不会有问题。这是代码段。
add
据Flutter医生说,一切都很好,谢谢您的帮助;-)
答案 0 :(得分:3)
也许您应该将唯一密钥传递给MessageItem
。
当您收到数据时:
new MessageItem(
msg['message'],
msg['timestamp'],
msg['status'],
_contactData['photo'],
key: Key(msg['message']+msg['timestamp'].toString())
)
添加新条目时:
_messageItems.add(
new MessageItem(
message, timestamp, 'sending', null, key: Key("${message}${timestamp}")
)
);
在MessageItem
构造函数中:
MessageItem(..., {Key key}): super(key: key);
另一种方法是为列表指定随机密钥,如下所示:
child: new ListView.builder(
key: new Key(randomString()),
您可以阅读https://flutter.io/widgets-intro/#keys中的键或查看Dismissible
小部件作为示例
答案 1 :(得分:0)
我在使用StreamBuilder监听Floor db的更改时遇到了类似的问题,其中StreamBuilder做出了反应,但ListView没有得到更新。尝试了以上解决方案
child: new ListView.builder(
key: UniqueKey(),
然后使用新数据更新ListView,但是存在一个问题,在上述实现中,刷新了ListView,这与添加新数据非常有效,但是当我在db中更新数据或使用可禁用的小部件删除数据时,再次刷新ListView并显示第一个元素。
所以我尝试将密钥添加到itemBuilder中的每个小部件中,并且对我有用
ListView.builder(
padding: const EdgeInsets.all(8),
itemCount: array.length,
itemBuilder: (context, index) {
return ListItemWidget(
dao: dao,
item: array[index],
key: UniqueKey(),
);
},
);