【问题标题】:Flutter - ListView not updating after adding item to list on AndroidFlutter - 在Android上将项目添加到列表后ListView没有更新
【发布时间】:2019-12-10 14:21:31
【问题描述】:

我正在尝试更新 ListView 在添加按钮的 onPressed 函数中,我使用 setState 函数在待办事项列表中添加了新的待办事项。但在android上它不起作用。在 iOS 上它工作正常。

ListView.builder(
  itemCount: todos.length,
  itemBuilder: (context, index) {
    return Padding(
      padding: EdgeInsets.symmetric(vertical: 1.0, horizontal: 4.0),
      child: Card(
        child: ListTile(
          onTap: () {},
          title: Text(todos[index].text),
        ),
      ),
    );
  },
);

onPressed: () async {
  Todo newTodo = Todo(text: todoText);
  newTodo.insert();
  setState(() {
    todos.add(newTodo);
  });
  Navigator.of(context).pop();
}

【问题讨论】:

    标签: listview flutter dart


    【解决方案1】:

    似乎问题出在钥匙上。 来自the docs

    键在构建相同类型小部件的许多实例的小部件中最有用。例如, ShoppingList 小部件,它构建了足够的 ShoppingListItem 实例来填充其可见区域:

    如果没有键,当前构建中的第一个条目将始终与前一个构建中的第一个条目同步,即使从语义上讲,列表中的第一个条目刚刚滚动到屏幕之外并且不再在视口中可见。

    通过为列表中的每个条目分配一个“语义”键,无限列表可以更有效,因为框架将条目与匹配的语义键同步,因此具有相似(或相同)的视觉外观。此外,在语义上同步条目意味着保留在有状态子窗口小部件中的状态仍然附加到相同的语义条目,而不是视口中相同数字位置的条目。

    更新您的代码以查看是否可行,

    你应该更新你的待办事项

    new Todo(text, key:Key(text))
    
    

    当插入一个新的待办事项时,

    todos.add(
      new Todo(text, key:Key("$text")))
    

    另一种指定随机密钥的方法是

    child: ListView.builder(
        key: Key(randomString()),
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多