drag_select_grid_view
一个支持拖放和点击选择项目的网格。

基本用法
首先,DragSelectGridView 构造函数与 GridView.builder 非常相似,所以您应该花时间了解后者,然后再深入研究这个库。
一旦您熟悉了 GridView.builder,可能唯一需要了解的额外信息就是 DragSelectGridViewController。通过它,您可以知道哪些索引被选中了。
查看此示例
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final controller = DragSelectGridViewController();
@override
void initState() {
super.initState();
controller.addListener(scheduleRebuild);
}
@override
void dispose() {
controller.removeListener(scheduleRebuild);
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: SelectionAppBar(
selection: controller.selection,
),
body: DragSelectGridView(
gridController: controller,
itemCount: 20,
itemBuilder: (context, index, selected) {
return SelectableItem(
index: index,
selected: selected,
);
},
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 80,
),
),
);
}
void scheduleRebuild() => setState(() {});
}
正如您在上面的代码中可能注意到的,为了提供良好的用户体验,DragSelectGridView 必须与其他两个小部件一起使用。在示例中,它们是:
-
SelectableItem:一个可选中的小部件,它将直观地指示项目是否被选中。 -
SelectionAppBar:一个自定义的AppBar,它显示选中的项目数量以及取消选中的选项。
该 示例项目 提供了一些这些小部件的样本。我不会将它们添加到库中,因为它们与网格本身无关,但只要您遵守许可条款,就可以随意将它们复制到您的项目中。
高级用法
您可以使用 setter DragSelectGridViewController.selection 来直接更改选择(我不确定您为什么需要这个,但我不会问问题)。
它允许这种交互

您可以在 此处 查看代码。
您还可以进行一些其他小的设置,使 DragSelectGridView 满足您的需求,例如 DragSelectGridView.autoScrollHotspotHeight 和 DragSelectGridView.unselectOnWillPop。这些功能都有很好的文档记录,所以我会让您自己探索。
希望这些是您使用此库所需了解的所有内容。