Flutter滑动操作插件perceive_slidable的使用
Flutter滑动操作插件perceive_slidable的使用
插件简介
perceive_slidable
是一个用于实现可拖动和滚动的滑动面板的 Flutter 插件。它允许用户通过单个手势进行滑动和滚动操作,并且可以将滑动面板锁定到多个指定的扩展高度。
特性:
- 支持多种滑动模式(永久嵌入或底部弹出对话框)。
- 可自定义滑动面板的高度、样式及交互行为。
- 提供丰富的回调函数,支持动态更新界面。
安装方法
在 pubspec.yaml
文件中添加依赖:
dependencies:
perceive_slidable: ^0.5.2
然后运行以下命令安装依赖:
flutter packages get
如果您喜欢这个包,别忘了给它一个 GitHub ⭐ 和 pub.dev ❤️!
使用方式
作为永久嵌入的 Widget
示例代码:
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.grey.shade200,
appBar: AppBar(
title: Text('简单示例'),
),
body: SlidingSheet(
elevation: 8, // 阴影深度
cornerRadius: 16, // 圆角半径
snapSpec: const SnapSpec( // 滑动锁定配置
snap: true, // 启用锁定功能
snappings: [0.4, 0.7, 1.0], // 锁定位置
positioning: SnapPositioning.relativeToAvailableSpace, // 相对屏幕高度定位
),
body: Center(
child: Text('此部件位于滑动面板下方'),
),
builder: (context, state) {
return Container(
height: 500, // 滑动面板内容高度
child: Center(
child: Text('这是滑动面板的内容'),
),
);
},
),
);
}
结果展示:
作为底部弹出对话框
示例代码:
void showAsBottomSheet() async {
final result = await showSlidingBottomSheet(
context,
builder: (context) {
return SlidingSheetDialog(
elevation: 8,
cornerRadius: 16,
snapSpec: const SnapSpec(
snap: true,
snappings: [0.4, 0.7, 1.0],
positioning: SnapPositioning.relativeToAvailableSpace,
),
builder: (context, state) {
return Container(
height: 400,
child: Center(
child: Material(
child: InkWell(
onTap: () => Navigator.pop(context, '这是结果'),
child: Padding(
padding: const EdgeInsets.all(16),
child: Text(
'这是滑动面板的内容',
style: Theme.of(context).textTheme.body1,
),
),
),
),
),
);
},
);
}
);
print(result); // 打印返回的结果
}
结果展示:
滑动锁定机制
可以通过 SnapSpec
自定义滑动面板的锁定行为。
参数说明:
参数 | 描述 |
---|---|
snap | 是否启用锁定功能。默认为 true 。 |
snappings | 锁定位置列表,表示滑动面板可以停靠的高度。 |
positioning | 定义锁定位置的计算方式:relativeToAvailableSpace 、relativeToSheetHeight 或 pixelOffset 。 |
onSnap | 当滑动面板停靠时触发的回调函数。 |
示例图片:
控制器(SheetController)
SheetController
可以手动控制滑动面板的状态。
常见方法:
方法名称 | 描述 |
---|---|
expand() | 展开滑动面板至最大高度。 |
collapse() | 折叠滑动面板至最小高度。 |
snapToExtent() | 将滑动面板锁定到指定高度。 |
scrollTo() | 滚动滑动面板到指定偏移量。 |
rebuild() | 强制重新构建滑动面板内容,而无需调用父组件的 setState() 。 |
show() | 显示隐藏状态的滑动面板。 |
hide() | 隐藏滑动面板,直到再次调用 show() 。 |
头部和尾部
头部和尾部是滑动面板顶部和底部的固定区域,不会随内容滚动。
示例代码:
headerBuilder: (context, state) {
return Container(
height: 56,
width: double.infinity,
color: Colors.green,
alignment: Alignment.center,
child: Text(
'这是头部',
style: Theme.of(context).textTheme.body1.copyWith(color: Colors.white),
),
);
},
footerBuilder: (context, state) {
return Container(
height: 56,
width: double.infinity,
color: Colors.yellow,
alignment: Alignment.center,
child: Text(
'这是尾部',
style: Theme.of(context).textTheme.body1.copyWith(color: Colors.black),
),
);
},
结果展示:
列表和列布局
当使用 ListView
或 Column
作为滑动面板的子部件时,需要注意设置以下属性:
- 对于
ListView
:设置shrinkWrap: true
和physics: NeverScrollableScrollPhysics()
。 - 对于
Column
:设置mainAxisSize: MainAxisSize.min
。
材料设计效果
通过监听滑动状态的变化,可以实现常见的 Material Design 效果,例如:
- 背景阴影变化。
- 面板圆角随高度变化。
- 内容滚动时头部抬升。
示例代码:
SheetListenerBuilder(
buildWhen: (oldState, newState) => oldState.isAtTop != newState.isAtTop,
builder: (context, state) {
return AnimatedContainer(
elevation: !state.isAtTop ? elevation : 0.0,
duration: const Duration(milliseconds: 400),
child: child,
);
},
);
更多关于Flutter滑动操作插件perceive_slidable的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter滑动操作插件perceive_slidable的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
perceive_slidable
是一个 Flutter 插件,用于在列表项或卡片上实现滑动操作(类似于滑动删除、滑动操作按钮等)。它提供了一种简单的方式来为你的应用添加滑动操作功能。以下是如何使用 perceive_slidable
插件的基本步骤。
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 perceive_slidable
插件的依赖:
dependencies:
flutter:
sdk: flutter
perceive_slidable: ^latest_version
然后运行 flutter pub get
来获取依赖。
2. 基本使用
perceive_slidable
的核心组件是 Slidable
,你可以将它包裹在任何你想添加滑动操作的部件上。
import 'package:flutter/material.dart';
import 'package:perceive_slidable/perceive_slidable.dart';
class SlidableExample extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Slidable Example'),
),
body: ListView(
children: [
Slidable(
actionPane: SlidableDrawerActionPane(),
actions: [
IconSlideAction(
caption: 'Archive',
color: Colors.blue,
icon: Icons.archive,
onTap: () => _showSnackBar(context, 'Archive'),
),
IconSlideAction(
caption: 'Share',
color: Colors.indigo,
icon: Icons.share,
onTap: () => _showSnackBar(context, 'Share'),
),
],
secondaryActions: [
IconSlideAction(
caption: 'More',
color: Colors.black45,
icon: Icons.more_horiz,
onTap: () => _showSnackBar(context, 'More'),
),
IconSlideAction(
caption: 'Delete',
color: Colors.red,
icon: Icons.delete,
onTap: () => _showSnackBar(context, 'Delete'),
),
],
child: ListTile(
title: Text('Slide Me'),
subtitle: Text('Swipe left or right to see actions'),
),
),
],
),
);
}
void _showSnackBar(BuildContext context, String message) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(message)),
);
}
}