Flutter滑动组件插件slideable的使用
Flutter滑动组件插件 slideable
的使用
Slideable 简介
Slideable
是一个灵活的滑动组件实现,允许您传递简单的 Widget(如图标或其他任何内容)作为操作项,并控制操作项的各种背景。它还提供了一个预定义的回调函数,可以自动关闭列表中已经滑出的项。
主要特性
- 灵活的操作项:您可以自由选择想要显示的操作项。
- 自动关闭已滑出的项:通过回调函数自动管理已滑出的项。
- 最多支持6个操作项:可以根据需要添加多个操作项。
- 自定义动画曲线和速度:可以控制滑动动画的速度和运动方式。
开始使用
添加依赖
在您的 Flutter 项目的 pubspec.yaml
文件中添加以下依赖:
dependencies:
slideable: <latest_version>
引入包
在您的页面或屏幕文件中添加以下导入语句:
import 'package:slideable/Slideable.dart';
基本用法
ActionItems
控制您希望在显示中的操作项。这是一个 List<ActionItems>
,每个 ActionItem
包含以下属性:
icon
: 必填项,可以是任意 Flutter Widget。onPress
: 必填项,定义点击该操作项时的行为。backgroundColor
: 默认为透明,可以根据需要更改。radius
: 可选参数,用于调整设计细节以匹配子部件的圆角半径。
示例代码如下:
ActionItems(
icon: const Icon(
Icons.thumb_up,
color: Colors.blue,
),
onPress: () {},
backgroundColor: Colors.transparent,
),
Slideable
需要一个 ActionItems
列表和一个 child
组件。其他可选参数包括:
backgroundColor
: 默认为透明,但可以根据需要更改。resetSlide
: 布尔值,通知Slideable
是否关闭所有已滑出的项。duration
: 控制滑动动画的时间。curve
: 控制滑动动画的速度或运动方式。
完整示例代码如下:
int resetSlideIndex = 0;
Slideable(
resetSlide: resetSlide,
items: <ActionItems>[
ActionItems(
icon: const Icon(
Icons.thumb_up,
color: Colors.blue,
),
onPress: () {},
backgroundColor: Colors.transparent,
),
],
child: Container(
padding: const EdgeInsets.symmetric(
horizontal: 10,
vertical: 12,
),
decoration: BoxDecoration(
color: const Color.fromARGB(255, 214, 214, 214),
border: Border.all(
width: 1,
color: const Color.fromARGB(124, 158, 158, 158),
),
borderRadius: BorderRadius.circular(10),
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
height: 50,
width: 50,
decoration: BoxDecoration(
color: Colors.grey[350],
shape: BoxShape.circle,
border: Border.all(
width: 1,
color: Colors.white,
),
),
child: ClipRRect(
borderRadius: BorderRadius.circular(100),
child: Image.network(
"https://images.pexels.com/photos/2379429/pexels-photo-2379429.jpeg?auto=compress&cs=tinysrgb&w=1600",
fit: BoxFit.cover,
),
),
),
const SizedBox(width: 5),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
"Name",
style: TextStyle(
color: Colors.grey,
fontSize: 12,
fontWeight: FontWeight.w800,
),
),
const SizedBox(height: 2),
const Text(
"George Ikwegbu",
style: TextStyle(
fontWeight: FontWeight.w500,
),
),
]
),
),
Text(
"#1",
style: const TextStyle(
fontWeight: FontWeight.w500,
),
),
],
),
),
);
示例 Demo
下面是一个完整的示例 Demo,展示了如何使用 Slideable
插件:
import 'package:flutter/material.dart';
import 'package:slideable/slideable.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Slideable Widget',
home: Home(),
);
}
}
class Home extends StatefulWidget {
const Home({Key? key}) : super(key: key);
@override
State<Home> createState() => _HomeState();
}
class _HomeState extends State<Home> {
int resetSlideIndex = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Class List"),
),
body: ListView.separated(
itemCount: _classList.length,
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20),
itemBuilder: (context, index) {
Map<String, dynamic> _student = _classList[index];
return GestureDetector(
onLongPressDown: (_) {
setState(() {
resetSlideIndex = index;
});
},
child: _listItem(
context: context,
student: _student,
index: index,
resetSlide: index == resetSlideIndex ? false : true,
),
);
},
separatorBuilder: (_, __) => const SizedBox(height: 10),
),
);
}
Slideable _listItem({
required BuildContext context,
required Map<String, dynamic> student,
required int index,
required bool resetSlide,
}) {
return Slideable(
resetSlide: resetSlide,
items: <ActionItems>[
ActionItems(
icon: const Icon(Icons.thumb_up, color: Colors.blue),
onPress: () => _likeUser(student["name"]),
backgroundColor: Colors.transparent,
),
ActionItems(
icon: const Icon(Icons.delete, color: Colors.red),
onPress: () => _deleteUser(student["name"]),
backgroundColor: Colors.transparent,
),
],
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 12),
decoration: BoxDecoration(
color: const Color.fromARGB(255, 214, 214, 214),
border: Border.all(width: 1, color: const Color.fromARGB(124, 158, 158, 158)),
borderRadius: BorderRadius.circular(10),
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
height: 50,
width: 50,
decoration: BoxDecoration(
color: Colors.grey[350],
shape: BoxShape.circle,
border: Border.all(width: 1, color: Colors.white),
),
child: ClipRRect(
borderRadius: BorderRadius.circular(100),
child: Image.network(
student["img"],
fit: BoxFit.cover,
),
),
),
const SizedBox(width: 5),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
"Name",
style: TextStyle(color: Colors.grey, fontSize: 12, fontWeight: FontWeight.w800),
),
const SizedBox(height: 2),
Text(
student["name"],
style: const TextStyle(fontWeight: FontWeight.w500),
),
],
),
),
Text(
"#${index + 1}",
style: const TextStyle(fontWeight: FontWeight.w500),
),
],
),
),
);
}
void _deleteUser(String user) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text("$user will be deleted."),
backgroundColor: Colors.grey[450],
),
);
}
void _likeUser(String user) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text("You gave $user a thumbs up, pretty cool 🥰"),
backgroundColor: Colors.grey[450],
),
);
}
final List<Map<String, dynamic>> _classList = [
{
"name": "Ikwegbu George",
"img": "https://images.pexels.com/photos/2379429/pexels-photo-2379429.jpeg?auto=compress&cs=tinysrgb&w=1600",
},
{
"name": "Phoebe Pelumi",
"img": "https://images.pexels.com/photos/3986672/pexels-photo-3986672.jpeg?auto=compress&cs=tinysrgb&w=1600&lazy=load",
},
{
"name": "James Mike",
"img": "https://images.pexels.com/photos/11828983/pexels-photo-11828983.jpeg?auto=compress&cs=tinysrgb&w=1600&lazy=load",
},
{
"name": "Abigail Ezinne",
"img": "https://images.pexels.com/photos/3030252/pexels-photo-3030252.jpeg?auto=compress&cs=tinysrgb&w=1600&lazy=load",
},
{
"name": "Chioma Chinedu",
"img": "https://images.pexels.com/photos/4491630/pexels-photo-4491630.jpeg?auto=compress&cs=tinysrgb&w=1600",
},
];
}
以上代码展示了一个简单的应用,其中包含一个学生名单,每个学生条目都可以滑动并执行点赞或删除操作。
更多关于Flutter滑动组件插件slideable的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter滑动组件插件slideable的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter中使用slideable
插件的示例代码。slideable
插件允许你对列表项进行滑动操作,比如删除、归档等。这里我们将使用flutter_slideable
包,它是一个流行的实现这一功能的插件。
首先,你需要在你的pubspec.yaml
文件中添加依赖:
dependencies:
flutter:
sdk: flutter
flutter_slideable: ^1.0.0 # 请确保使用最新版本
然后运行flutter pub get
来安装依赖。
接下来,让我们编写一个使用Slideable
组件的示例代码。假设我们有一个简单的待办事项列表,用户可以左右滑动来删除或标记为完成。
import 'package:flutter/material.dart';
import 'package:flutter_slideable/flutter_slideable.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Slideable Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: TodoListScreen(),
);
}
}
class TodoListScreen extends StatefulWidget {
@override
_TodoListScreenState createState() => _TodoListScreenState();
}
class _TodoListScreenState extends State<TodoListScreen> {
final List<String> todos = ['Todo 1', 'Todo 2', 'Todo 3'];
void _removeTodo(int index) {
setState(() {
todos.removeAt(index);
});
}
void _completeTodo(int index) {
setState(() {
todos[index] = todos[index] + ' (Completed)';
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Todo List'),
),
body: ListView.builder(
itemCount: todos.length,
itemBuilder: (context, index) {
return Slideable(
actions: <Widget>[
IconSlideAction(
caption: 'Delete',
color: Colors.red,
icon: Icons.delete,
onTap: () => _removeTodo(index),
),
],
secondaryActions: <Widget>[
IconSlideAction(
caption: 'Complete',
color: Colors.green,
icon: Icons.done,
onTap: () => _completeTodo(index),
),
],
child: ListTile(
title: Text(todos[index]),
),
);
},
),
);
}
}
在这个示例中,我们创建了一个简单的待办事项列表,每个列表项都是一个Slideable
组件。Slideable
组件包含两个动作:一个是删除动作(红色图标),另一个是完成动作(绿色图标)。当用户向左或向右滑动列表项时,这些动作按钮就会出现,用户点击相应的按钮就会触发删除或完成操作。
actions
参数定义了当用户向右滑动时出现的动作。secondaryActions
参数定义了当用户向左滑动时出现的动作。child
参数是滑动组件的内容,这里是一个ListTile
。
这个示例展示了如何在Flutter中使用flutter_slideable
包来实现列表项的滑动操作。你可以根据需要进一步自定义和扩展这个示例。