Flutter长按拖拽网格视图插件long_press_draggable_gridview的使用
Flutter长按拖拽网格视图插件long_press_draggable_gridview
的使用
平台支持
本插件支持在多平台上实现GridView.builder
中的拖拽功能。它提供了GridView.builder
的所有属性,并且只需要几行代码即可轻松实现。
该项目基于flutter_draggable_gridview,该库仅允许一次存在一个网格视图,因此我们对其进行了修改,并添加了对CustomScrollView
的支持。
可拖拽的网格视图
使用方法
示例代码
DraggableGridViewBuilder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: MediaQuery.of(context).size.width / (MediaQuery.of(context).size.height / 3),
),
children: _listOfDraggableGridItem,
isOnlyLongPress: false,
dragCompletion: (List<DraggableGridItem> list, int beforeIndex, int afterIndex) {
print('onDragAccept: $beforeIndex -> $afterIndex');
},
dragFeedback: (List<DraggableGridItem> list, int index) {
return Container(
child: list[index].child,
width: 200,
height: 150,
);
},
dragPlaceHolder: (List<DraggableGridItem> list, int index) {
return PlaceHolderWidget(
child: Container(
color: Colors.white,
),
);
},
);
必需参数
gridDelegate
一个控制网格视图中子部件布局的委托。
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2, // 每行显示2个元素
childAspectRatio: MediaQuery.of(context).size.width / (MediaQuery.of(context).size.height / 3), // 设置子项宽高比
)
children
包含DraggableGridItem
列表的属性,用于在GridView.builder
中显示小部件以提供拖放功能。此外,它还包含isDraggable
参数,用于启用或禁用拖放功能。
children: _listOfDraggableGridItem,
dragCompletion
此回调提供更新后的列表和旧的与新的索引。
dragCompletion: (List<DraggableGridItem> list, int beforeIndex, int afterIndex) {
print('onDragAccept: $beforeIndex -> $afterIndex');
},
可选参数
dragFeedback
通过此回调,您需要返回一个小部件,并且我们将使用此小部件作为反馈。了解更多关于反馈的信息可以从Draggable类中获取。
dragFeedback: (List<DraggableGridItem> list, int index) {
return Container(
child: list[index].child,
width: 200,
height: 150,
);
},
dragPlaceHolder
通过此回调,您需要返回一个PlaceHolderWidget
,并且我们将使用此小部件作为占位符。
dragPlaceHolder: (List<DraggableGridItem> list, int index) {
return PlaceHolderWidget(
child: Container(
color: Colors.white,
),
);
},
dragChildWhenDragging
通过此回调,您需要返回一个小部件,并且当拖动进行时,我们将显示此小部件而不是子部件。了解更多关于childWhenDragging
的信息可以从Draggable类中获取。
dragChildWhenDragging: (List<DraggableGridItem> list, int index) {
return Container(
child: list[index].child,
width: 200,
height: 150,
);
},
最后但同样重要
您可以使用所有GridView.builder
的属性来创建DraggableGridViewBuilder
类。
注意事项
结果将以列表形式返回,因此可能会丢失,如果您需要,您需要负责将它们存储在永久位置。
贡献者指南
对于贡献者来说,向我们的仓库贡献总是受欢迎的。我们请求贡献者只向develop
分支创建拉取请求。
报告问题/功能请求指南
如果您能分享以下信息,对我们理解问题的根本原因会有很大帮助:
- 库版本
- 代码片段
- 如果适用,日志
- 设备规格(制造商,操作系统版本等)
- 重现问题的截图/视频及步骤
许可证
Flutter Draggable GridView 是 MIT-licensed。
示例代码
import 'package:example/constants/colors.dart';
import 'package:example/constants/strings.dart';
import 'package:example/pages/grid_example.dart';
import 'package:example/pages/grid_with_scrollcontroller.dart';
import 'package:example/pages/grid_with_sliver.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
const SystemUiOverlayStyle dark = SystemUiOverlayStyle(
systemNavigationBarColor: Colors.transparent,
systemNavigationBarDividerColor: null,
statusBarColor: null,
systemNavigationBarIconBrightness: Brightness.light,
statusBarIconBrightness: Brightness.dark,
statusBarBrightness: Brightness.light,
);
SystemChrome.setSystemUIOverlayStyle(dark);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: Strings.app_title,
theme: ThemeData(
primarySwatch: AppColors.primaryColor,
),
home: MyHomePage(
title: Strings.app_title,
),
);
}
}
class MyHomePage extends StatelessWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Color(0xFFEFEEEE),
appBar: AppBar(
centerTitle: true,
title: Text(title),
),
body: SafeArea(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => GridExample(
title: 'Grid Example',
),
),
);
},
child: Text('Grid Example'),
),
SizedBox(height: 50),
ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => GridWithScrollControllerExample(
title: 'Grid With ScrollController Example',
),
),
);
},
child: Text('Grid With ScrollController Example'),
),
SizedBox(height: 50),
ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => GridSliverExample(
title: 'Grid With CustomScrollView Example',
),
),
);
},
child: Text('Grid With CustomScrollView Example'),
),
],
),
),
),
);
}
}
更多关于Flutter长按拖拽网格视图插件long_press_draggable_gridview的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter长按拖拽网格视图插件long_press_draggable_gridview的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中集成和使用long_press_draggable_gridview
插件的一个示例代码。这个插件允许你创建一个可以长按拖拽项目的网格视图。
首先,确保你已经在pubspec.yaml
文件中添加了long_press_draggable_gridview
依赖:
dependencies:
flutter:
sdk: flutter
long_press_draggable_gridview: ^x.y.z # 请替换为最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,你可以在你的Flutter应用中实现一个可拖拽的网格视图。以下是一个完整的示例代码:
import 'package:flutter/material.dart';
import 'package:long_press_draggable_gridview/long_press_draggable_gridview.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Long Press Draggable GridView Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final List<String> items = List.generate(25, (index) => 'Item $index');
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Long Press Draggable GridView Demo'),
),
body: Padding(
padding: const EdgeInsets.all(8.0),
child: LongPressDraggableGridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
crossAxisSpacing: 4.0,
mainAxisSpacing: 4.0,
),
itemCount: items.length,
itemBuilder: (BuildContext context, int index) {
return Card(
child: Center(
child: Text(items[index]),
),
);
},
onWillAccept: (oldIndex, newIndex) {
// 在这里处理拖拽结束前的逻辑,如果需要的话
return true; // 返回true表示接受拖拽
},
onDragCompleted: (oldIndex, newIndex) {
// 在这里处理拖拽完成后的逻辑
setState(() {
final String item = items.removeAt(oldIndex);
items.insert(newIndex, item);
});
},
),
),
);
}
}
代码解释:
- 依赖添加:在
pubspec.yaml
中添加long_press_draggable_gridview
依赖。 - 主应用:
MyApp
是应用的根组件,它定义了一个基本的Material应用。 - 主页面:
MyHomePage
是一个有状态的组件,它包含了主要的网格视图逻辑。 - 数据列表:
items
是一个包含25个字符串的列表,用于在网格视图中显示。 - 网格视图:
LongPressDraggableGridView.builder
用于构建网格视图。它接受一个gridDelegate
来定义网格的布局,itemCount
指定项目数量,itemBuilder
用于构建每个网格项。 - 拖拽逻辑:
onWillAccept
:在拖拽完成前调用,返回true
表示接受拖拽。onDragCompleted
:在拖拽完成后调用,用于更新数据列表和UI。
这个示例展示了如何使用long_press_draggable_gridview
插件创建一个可以长按拖拽的网格视图,并处理拖拽完成后的数据更新。你可以根据具体需求进一步定制这个示例。