【发布时间】:2020-12-10 06:08:03
【问题描述】:
我正在尝试创建一个基本列表视图,它负责单击列表拼贴并选择项目。 然后它会为每个项目显示一个复选框,并跟踪已选择的项目数量。 我所有的列表都需要这个特性,所以把它放在某个基类中是有意义的。 但是我将如何使用颤振来做到这一点?
以下代码包含部分逻辑:
Widget build(BuildContext context) {
return ListView.separated(
padding: const EdgeInsets.all(8),
separatorBuilder: (context, index) => Divider(
color: Colors.grey,
),
itemCount: widget.models.length,
itemBuilder: (BuildContext context, int index) {
return ListTile(onLongPress: () {
selectMode = true;
widget.models[index].selected = true;
selectCount++;
setState(() {});
}, onTap: () {
if (selectMode) {
if (widget.models[index].selected) {
widget.models[index].selected = false;
selectCount--;
} else {
widget.models[index].selected = true;
selectCount++;
}
if (selectCount == 0) {
selectMode = false;
}
setState(() {});
return;
}
});
},
);
}
我不知道如何从这里继续。当把它全部放在一个特定的列表中时,这显然工作得很好。但是将它放在基类中并简单地继承这种行为会更有意义。 是否可以将此逻辑移动到基类中,并且仍然可以为其他列表定义不同的 ListTiles? 我读到你根本不应该在颤振中继承小部件,所以我真的不知道如何继续,但肯定有比必须将此逻辑复制/粘贴到每个新列表中更好的方法。
编辑: ListTile 显示基于 selectMode 的复选框:
ListTile(
onLongPress: () {
},
leading: CircleAvatar(
radius: 30,
backgroundColor: Color.fromARGB(255, 33, 84, 158),
child: Icon(Icons.location_on, color: Colors.white, size: 40),
),
title: Text('Title $index'),
subtitle: Text('${models[index]}'),
trailing: Visibility(
visible: selectMode,
child: models[index].selected == true
? Icon(Icons.check_box, color: Color.fromARGB(255, 33, 84, 158))
: Icon(Icons.check_box_outline_blank,
color: Color.fromARGB(255, 33, 84, 158))),
onTap: () {
});
这是另一件事,应该成为“基础”的一部分,否则您必须将其粘贴到您创建的每个列表视图中。因此,当我有一些自定义列表视图小部件时,它已经内置了一个 listTile 来处理单击和显示复选框,新的列表视图如何能够具有不同样式的 listTile,可能没有前导图标等?
我创建了一个小 DartPad 来展示它是如何工作的: https://dartpad.dev/98d3f9b01c5b048d90aad3467aa3954e
现在,您希望在您创建的每个列表中都具有相同的行为,而无需再次编写相同的代码并且仍然能够使用不同类型的 listTiles,甚至可以向 onTap 事件等添加操作。
【问题讨论】:
标签: flutter listview inheritance dart