ListView 传递了一个列表。有必要通过点击从这个 ListView 中删除一个元素。当 ListView builder 的参数没有指定key:
或指定时,GlobalKey()
那么当 list 元素被删除时,元素的编号飞快,列表在视觉上正确显示,但是如果你尝试编辑某些元素,那么这样的元素会有不正确的数据。例如,如果在 ListView 构建器中指定了某些唯一标识符,key: UniqueKey()
则 ListView 元素的行为变得正确且可预测,但在删除任何元素后,列表将自动滚动到最开始,到它的第一个元素。我想从 ListView 中删除一个元素,以便之后它的行为是正确的,并且 ListView 本身不会滚动到最开始。
在这里,我存储了一个列表,我将其传递给 ListView
List<Channel> _editorChannels;
这就是我删除元素的方式。我通过唯一 ID 在列表中查找它并将其删除。
onDelete(Channel c) {
final f = _editorChannels.firstWhere((element) => element.Id == c.Id,
orElse: () => null);
if (f != null) setState(() => _editorChannels.remove(f));
}
这就是 ListView 的样子,它位于 DefaultTabController 选项卡之一中,我将仅简要显示一个选项卡的代码,以免代码过多。
Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: Scaffold(
body: ListView.builder(
key: UniqueKey(),
itemCount: _editorChannels == null
? 0
: _editorChannels.length,
itemBuilder: (context, index) {
final item = _editorChannels[index];
return Card(
shadowColor: Colors.black26,
margin: EdgeInsets.all(3.0),
clipBehavior: Clip.antiAlias,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(2),
),
child: ListTile(
title: Container(
child: Text(
item.Name != null ? item.Name : '',
style: new TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16.0),
)),
subtitle: Text(item.Url),
onTap: () => {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
ChewieDemo(channel: item)),
)
},
isThreeLine: false,
leading: getIconbyId(item.Status),
trailing: PopMenuWidget(
channel: item,
onDelete: () => onDelete(item),
onUpdate: (item) => onUpdate(item),
)),
);
}),
),
)
],
),