Flutter可滑动移除页面插件dismissible_page的使用

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

Flutter可滑动移除页面插件dismissible_page的使用

简介

dismissible_page 是一个Flutter插件,它允许你通过滑动手势来关闭页面,从而提供更直观和动态的用户交互体验。你可以设置页面在任意方向上被滑动关闭,并且支持动画效果如边框、背景和缩放等。

主要特性

  • 支持多方向滑动关闭
  • 适用于嵌套列表视图
  • 动画效果包括:边框、背景颜色及缩放
  • 提供了丰富的自定义选项以满足不同需求

示例代码

以下是一个完整的示例demo,展示了如何使用 dismissible_page 插件创建一个可以滑动关闭的页面。

依赖配置

首先,在你的 pubspec.yaml 文件中添加 dismissible_page 依赖:

dependencies:
  flutter:
    sdk: flutter
  dismissible_page: ^latest_version # 替换为最新版本号

然后运行 flutter pub get 来安装依赖。

完整代码

main.dart

import 'package:dismissible_page/dismissible_page.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Dismissible Page Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SimpleExample(),
    );
  }
}

/// This is a basic usage of DismissiblePage
/// For more examples check the demo/folder
class SimpleExample extends StatelessWidget {
  static const imagePath = 'assets/images/home_1.png';

  const SimpleExample({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.transparent,
        elevation: 0,
        title: Text('Simple Example'),
        titleTextStyle: TextStyle(
          fontSize: 16,
          fontWeight: FontWeight.w600,
          color: Colors.black.withOpacity(.85),
        ),
      ),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 20),
          child: GestureDetector(
            onTap: () {
              // Use extension method to use [TransparentRoute]
              // This will push page without route background
              Navigator.of(context).push(TransparentRoute(builder: (_) => SecondPage(imagePath: imagePath)));
            },
            child: Hero(
              tag: imagePath,
              child: ClipRRect(
                borderRadius: BorderRadius.circular(12),
                child: Image.asset(imagePath, fit: BoxFit.cover),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

class SecondPage extends StatelessWidget {
  final String imagePath;

  const SecondPage({required this.imagePath});

  @override
  Widget build(BuildContext context) {
    return DismissiblePage(
      onDismissed: () => Navigator.of(context).pop(),
      // Start of the optional properties
      isFullScreen: false,
      disabled: false,
      minRadius: 10,
      maxRadius: 10,
      dragSensitivity: 1.0,
      maxTransformValue: .8,
      direction: DismissiblePageDismissDirection.multi,
      backgroundColor: Colors.black,
      onDragStart: () {
        print('onDragStart');
      },
      onDragUpdate: (details) {
        print(details);
      },
      dismissThresholds: {
        DismissiblePageDismissDirection.vertical: .2,
      },
      minScale: .8,
      startingOpacity: 1,
      reverseDuration: const Duration(milliseconds: 250),
      // End of the optional properties
      child: Scaffold(
        body: SingleChildScrollView(
          physics: ClampingScrollPhysics(),
          child: Column(
            children: [
              Hero(
                tag: imagePath,
                child: Image.asset(imagePath, fit: BoxFit.cover),
              ),
              ...List.generate(40, (index) => index + 1).map((index) {
                return ListTile(
                  title: Text(
                    'Item $index',
                    style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500),
                  ),
                );
              }),
            ],
          ),
        ),
      ),
    );
  }
}

关键点解释

  1. 导入包:确保导入了 dismissible_page 包。
  2. 创建主页面 (SimpleExample) 和可滑动关闭的页面 (SecondPage)。
  3. GestureDetector:用于检测点击事件,触发新页面的显示。
  4. Hero动画:实现两个页面之间平滑过渡的效果。
  5. DismissiblePage构造器参数
    • onDismissed: 当页面被完全滑出时调用此回调函数。
    • 其他可选参数(如 direction, isFullScreen 等)可以根据实际需要进行调整。

希望这个例子能帮助你更好地理解和使用 dismissible_page 插件!如果有任何问题或需要进一步的帮助,请随时提问。


更多关于Flutter可滑动移除页面插件dismissible_page的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter可滑动移除页面插件dismissible_page的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用dismissible_page插件来实现可滑动移除页面的代码示例。dismissible_page 并不是一个官方的 Flutter 插件,但假设它是一个自定义的或社区提供的插件,其行为类似于允许用户通过滑动来移除页面。

首先,你需要确保你的 Flutter 项目已经添加了该插件。如果这是一个自定义插件或第三方插件,你可能需要在 pubspec.yaml 文件中添加依赖项(假设插件名为 dismissible_page,并且已经发布在 pub.dev 上)。不过,由于这不是一个官方插件,以下示例将假设你已经有了一个实现类似功能的自定义组件。

1. 添加依赖(假设插件存在)

在你的 pubspec.yaml 文件中添加依赖项(这一步是假设性的,因为dismissible_page并非真实存在的官方插件):

dependencies:
  flutter:
    sdk: flutter
  dismissible_page: ^x.y.z  # 替换为实际版本号

然后运行 flutter pub get 来安装依赖。

2. 使用 DismissiblePage 组件

假设你已经有一个 DismissiblePage 组件,你可以像这样在你的 Flutter 应用中使用它:

import 'package:flutter/material.dart';
import 'package:dismissible_page/dismissible_page.dart'; // 假设插件提供了这个包

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: DismissiblePageScaffold(
        pages: [
          // 创建一个列表,包含你想要显示的可移除页面
          DismissiblePage(
            key: ValueKey('Page 1'), // 使用唯一的Key来标识每个页面
            child: Center(
              child: Text('Page 1'),
            ),
            onDismissed: () {
              // 页面被移除时的回调
              print('Page 1 dismissed');
            },
          ),
          DismissiblePage(
            key: ValueKey('Page 2'),
            child: Center(
              child: Text('Page 2'),
            ),
            onDismissed: () {
              print('Page 2 dismissed');
            },
          ),
          // 添加更多页面...
        ],
      ),
    );
  }
}

// 假设的 DismissiblePageScaffold,用于包裹 DismissiblePage 的 Scaffold
class DismissiblePageScaffold extends StatefulWidget {
  final List<DismissiblePage> pages;

  DismissiblePageScaffold({required this.pages});

  @override
  _DismissiblePageScaffoldState createState() => _DismissiblePageScaffoldState();
}

class _DismissiblePageScaffoldState extends State<DismissiblePageScaffold> {
  List<DismissiblePage> _pages = [];

  @override
  void initState() {
    super.initState();
    _pages = widget.pages;
  }

  void _removePage(DismissiblePage page) {
    setState(() {
      _pages.remove(page);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Dismissible Pages Demo'),
      ),
      body: _pages.isEmpty
          ? Center(child: Text('No more pages'))
          : PageView.builder(
              itemCount: _pages.length,
              itemBuilder: (context, index) {
                return GestureDetector(
                  onHorizontalDragEnd: (details) {
                    if (details.primaryVelocity > 0) {
                      // 用户向右滑动,移除当前页面
                      _removePage(_pages[index]);
                    }
                  },
                  child: _pages[index],
                );
              }),
    );
  }
}

// 假设的 DismissiblePage 组件,用于包装可移除的内容
class DismissiblePage extends StatelessWidget {
  final Widget child;
  final VoidCallback onDismissed;

  DismissiblePage({required this.child, required this.onDismissed});

  @override
  Widget build(BuildContext context) {
    // 这里可以添加实际的滑动移除逻辑,但为简化起见,我们只用 GestureDetector 示例
    return GestureDetector(
      // 实际上,这里的滑动逻辑应该更复杂,可能需要结合 DragGestureRecognizer 来实现
      onPanEnd: (details) {
        if (details.primaryVelocity > 0) {
          onDismissed();
        }
      },
      child: child,
    );
  }
}

注意事项

  1. 实际插件:上述代码假设了一个名为 dismissible_page 的插件存在,但实际上这样的插件可能并不存在。如果它是一个自定义组件,你需要根据实际的实现来调整代码。

  2. 滑动逻辑:上面的 DismissiblePage 组件中的滑动逻辑是非常简化的。在真实场景中,你可能需要更复杂的滑动和动画效果,这可能需要结合 DragGestureRecognizer 或其他手势识别器来实现。

  3. 状态管理:如果页面数量或内容动态变化,你可能需要使用更复杂的状态管理方案(如 ProviderRiverpodBloc)来管理页面的状态。

  4. 依赖项:确保你已经正确添加了所有必要的依赖项,并运行了 flutter pub get 来安装它们。

希望这个示例能帮助你理解如何在 Flutter 中实现可滑动移除页面的功能!

回到顶部