Flutter持久顶部弹窗插件persistent_top_sheet的使用

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

Flutter持久顶部弹窗插件 persistent_top_sheet 的使用

概述

persistent_top_sheet 是一个用于在 Flutter 应用中添加可自定义的顶部弹窗的插件。该插件允许用户通过手势或控制器控制弹窗的打开、关闭和拖动操作,并且提供了平滑的动画效果。

特性

  • 完全可自定义的顶部弹窗,适用于各种使用场景。
  • 提供平滑的打开、关闭和拖动交互动画。

Demo

快速开始

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 persistent_top_sheet 包:

dependencies:
  persistent_top_sheet: ^latest_version

然后运行以下命令来获取包:

flutter pub get

2. 导入包

在 Dart 文件中导入该包:

import 'package:persistent_top_sheet/persistent_top_sheet.dart';

使用方法

创建控制器

你可以创建一个 PersistentTopSheetController 来控制弹窗的打开、关闭和切换状态:

final controller = PersistentTopSheetController();

使用 PersistentTopSheet

接下来,使用 PersistentTopSheet 组件来创建顶部弹窗:

PersistentTopSheet(
    maxHeight: 500, // 最大高度
    minHeight: 50,  // 最小高度
    controller: controller, // 控制器
    childBuilder: (currentHeight) => SheetBody(currentHeight: currentHeight), // 弹窗内容构建器
    handleBuilder: (currentHeight) => const DragHandle(), // 拖动手柄构建器
    onStateChanged: (state) => debugPrint('isOpen: $state'), // 状态变化回调
);

示例代码

下面是一个完整的示例代码,展示了如何在应用中使用 persistent_top_sheet 插件:

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

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

class MainApp extends StatelessWidget {
  final controller = PersistentTopSheetController();

  MainApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        backgroundColor: Colors.grey,
        appBar: AppBar(
          title: const Text('Persistent Top Sheet Example'),
          backgroundColor: Colors.blue,
        ),
        body: Stack(
          children: [
            LayoutBuilder(builder: (context, constraints) {
              return PersistentTopSheet(
                maxHeight: constraints.maxHeight - 48,
                minHeight: 50,
                controller: controller,
                childBuilder: (currentHeight) =>
                    SheetBody(currentHeight: currentHeight),
                handleBuilder: (currentHeight) => const DragHandle(),
                onStateChanged: (state) => debugPrint('isOpen: $state'),
              );
            }),
            Center(
              child: ElevatedButton(
                onPressed: controller.toggle, // 切换打开/关闭
                child: const Text('Toggle open/close'),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class SheetBody extends StatelessWidget {
  const SheetBody({
    super.key,
    required this.currentHeight,
  });

  final double currentHeight;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
      color: Colors.amber,
      child: Padding(
        padding: const EdgeInsets.only(top: 8),
        child: Align(
          alignment: Alignment.topCenter,
          child: Text('height: ${currentHeight.round()}'),
        ),
      ),
    );
  }
}

class DragHandle extends StatelessWidget {
  const DragHandle({
    super.key,
  });

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MouseRegion(
      child: Container(
        height: kMinInteractiveDimension,
        decoration: BoxDecoration(
          color: Theme.of(context).colorScheme.surface,
          borderRadius: const BorderRadius.vertical(bottom: Radius.circular(24)),
        ),
        child: Center(
          child: Container(
            height: 4,
            width: 32,
            decoration: BoxDecoration(
              borderRadius: BorderRadius.circular(2),
              color: Theme.of(context).dividerColor,
            ),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter持久顶部弹窗插件persistent_top_sheet的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter持久顶部弹窗插件persistent_top_sheet的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 persistent_top_sheet 插件的 Flutter 代码示例。这个插件允许你在应用中创建一个持久性的顶部弹窗,类似于 iOS 的 UIModalPresentationOverFullScreen 样式。

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

dependencies:
  flutter:
    sdk: flutter
  persistent_top_sheet: ^x.y.z  # 请将 x.y.z 替换为最新版本号

然后运行 flutter pub get 来获取依赖。

接下来是一个完整的 Flutter 应用示例,展示了如何使用 persistent_top_sheet

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Persistent Top Sheet Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              showPersistentTopSheet(
                context: context,
                builder: (context) => PersistentTopSheetContent(),
                barrierDismissible: true,  // 是否可以通过点击背景关闭
                barrierColor: Colors.grey.withOpacity(0.5),  // 背景颜色
                backgroundColor: Colors.white,  // 弹窗背景颜色
                elevation: 4.0,  // 弹窗阴影
                expandedHeight: 200.0,  // 弹窗展开高度
                maxSheetHeightFraction: 0.8,  // 最大高度占屏幕高度的比例
                onSheetStateChanged: (state) {
                  // 处理弹窗状态变化,比如展开或收起
                  print('Sheet state changed to: $state');
                },
              );
            },
            child: Text('Show Persistent Top Sheet'),
          ),
        ),
      ),
    );
  }
}

class PersistentTopSheetContent extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          Text('This is a persistent top sheet!'),
          SizedBox(height: 16.0),
          ElevatedButton(
            onPressed: () {
              Navigator.of(context).pop();  // 关闭弹窗
            },
            child: Text('Close'),
          ),
        ],
      ),
    );
  }
}

代码说明:

  1. 依赖添加:在 pubspec.yaml 中添加 persistent_top_sheet 依赖。
  2. 主应用MyApp 是一个简单的 Flutter 应用,包含一个按钮,用于显示持久顶部弹窗。
  3. 按钮点击事件:点击按钮时,调用 showPersistentTopSheet 方法,显示一个 PersistentTopSheetContent 组件。
  4. PersistentTopSheetContent:这是弹窗的内容,包含一个文本和一个关闭按钮。
  5. showPersistentTopSheet 参数
    • context:当前上下文。
    • builder:用于构建弹窗内容的函数。
    • barrierDismissible:是否可以通过点击背景关闭弹窗。
    • barrierColor:背景颜色。
    • backgroundColor:弹窗背景颜色。
    • elevation:弹窗阴影。
    • expandedHeight:弹窗展开的高度。
    • maxSheetHeightFraction:最大高度占屏幕高度的比例。
    • onSheetStateChanged:处理弹窗状态变化的回调。

你可以根据需要调整这些参数,以符合你的应用需求。

回到顶部