我有一个这样的ListView,但是当“ mats”的值更改时它不会更新。每当有我的垫子列表更新时,都会调用build函数。打印显示正确的数据,但ListView更新不正确。只有项目数更新正确。
颤振:MATS:[[8163b55b-9a4c-44e8-a95e-064b3f5e8a67,,26.06.2019,[],0.00 EUR]] 扑扑:MATS:[[8163b55b-9a4c-44e8-a95e-064b3f5e8a67,未命名,26.06.2019,[],0.00欧元]]
Widget build(BuildContext context) {
print('MATS: $mats');
return Padding(
padding: const EdgeInsets.all(8.0),
child: mats.length == 0
? Center(
child: Text('Add your first mat to start the party.'),
)
: mats != null
? ListView.builder(
key: Key('matsList'),
itemCount: mats?.length ?? 0,
itemBuilder: (context, index) {
final viewModel = mats[index];
return MatCardView(
key: Key('viewModel.toString()'),
viewModel: viewModel,
onSelect: onSelect,
);
})
: Container(
child: Center(
child: Text('No beer mat yet'),
),
),
);
}
答案 0 :(得分:2)
每个项目的key
都相同。它使Flutter感到困惑,因为它使用key
来确定哪个UI元素用于哪个小部件。
尝试将每个列表项的键更改为唯一值。这是朝着这个目标迈进的一步,也许这行得通:
Widget build(BuildContext context) {
print('MATS: $mats');
return Padding(
padding: const EdgeInsets.all(8.0),
child: mats.length == 0
? Center(
child: Text('Add your first mat to start the party.'),
)
: mats != null
? ListView.builder(
key: Key('matsList'),
itemCount: mats?.length ?? 0,
itemBuilder: (context, index) {
final viewModel = mats[index];
return MatCardView(
key: Key("item$index"), // THIS LINE CHANGED
viewModel: viewModel,
onSelect: onSelect,
);
})
: Container(
child: Center(
child: Text('No beer mat yet'),
),
),
);
}
请注意上面唯一更改的行。也许Key(viewModel.toString())
(不带引号)也可以工作,但我不知道您对此的实现。如果这不起作用,您也可以尝试。