Flutter ListView.builder插入后未更新

时间:2018-07-11 07:29:34

标签: dart flutter flutter-layout

我有一个SQLite数据库,可以从中查询数据。根据这些数据,我创建了必要的小部件并将它们存储在列表中。将列表传递给ListView.builder我从列表中创建项目。除了将新数据添加到小部件列表中外,其他一切看起来都不错。如果我使用.mean(),则什么也没有显示。如果我使用insert不会有问题。这是代码段。

add

据Flutter医生说,一切都很好,谢谢您的帮助;-)

2 个答案:

答案 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(),
        );
      },
    );