Flutter-将项目添加到Android上的列表后,ListView不更新

时间:2019-12-10 14:21:31

标签: listview flutter dart

我正在尝试更新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();
}

1 个答案:

答案 0 :(得分:0)

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

  

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

     

没有键,即使从语义上来说,列表中的第一个条目只是从屏幕上滚动出来并且在视口中不再可见,当前构建中的第一个条目也将始终与先前构建中的第一个条目同步。 / p>      

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

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

您应该更新待办事项

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

插入新的待办事项时,

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

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

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