Flutter滑动操作插件perceive_slidable的使用

发布于 1周前 作者 caililin 来自 Flutter

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 定义锁定位置的计算方式:relativeToAvailableSpacerelativeToSheetHeightpixelOffset
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),
    ),
  );
},

结果展示:

头部尾部示例


列表和列布局

当使用 ListViewColumn 作为滑动面板的子部件时,需要注意设置以下属性:

  • 对于 ListView:设置 shrinkWrap: truephysics: 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

1 回复

更多关于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)),
    );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!