Flutter滑动面板插件sliding_panel的使用

Flutter滑动面板插件sliding_panel的使用

sliding_panel 是一个高度可定制的底部滑动面板插件,可以在 pub.dev 上找到。它可以根据你的需求进行个性化配置!


功能亮点

自定义控制 高度自定义化 多种用途

轻松将内容放入面板中,根据需要进行自定义,并将其用于多种目的,例如:

  • 在屏幕底部显示一些持久性内容。
  • 可以像 Flutter 的 showModalBottomSheet() 一样,让用户做出选择。
  • 还可以像 DraggableScrollableSheet() 一样,将滚动内容放入面板中。

如何使用 sliding_panel

请访问 Wiki 查看如何让这个插件运行起来。


示例代码

以下是一个完整的示例代码,展示如何在 Flutter 中使用 sliding_panel 插件。

// 导入必要的库
import 'package:flutter/material.dart';

// 主应用程序入口
void main() => runApp(MyApp());

// 主应用程序类
class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
      debugShowCheckedModeBanner: false, // 移除调试标志
    );
  }
}

// 主页面类
class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

// 主页面状态类
class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SlidingPanel 示例'), // 设置标题
      ),
      body: ListView(
        children: <Widget>[
          // 点击跳转到 SafeArea 示例
          ListTile(
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => SafeAreaExample()),
              );
            },
            title: Text('SafeArea 配置'),
          ),
          Divider(), // 添加分隔线
          // 点击跳转到双状态面板示例
          ListTile(
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => TwoStateExample()),
              );
            },
            title: Text('双状态面板与结果传递'),
          ),
          Divider(),
          // 点击跳转到动态调整面板高度示例
          ListTile(
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => SizingExample()),
              );
            },
            title: Text('动态调整面板高度'),
          ),
          Divider(),
          // 点击跳转到无主体内容面板示例
          ListTile(
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => SeparateContentExample()),
              );
            },
            title: Text('无主体内容的面板'),
          ),
          Divider(),
          // 点击跳转到自定义面板示例
          ListTile(
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => CustomizeDemo()),
              );
            },
            title: Text('使用 PanelController、回调函数和自定义功能'),
          ),
          Divider(),
          // 点击跳转到最大宽度、页脚和滚动数据示例
          ListTile(
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => FooterAndScroll()),
              );
            },
            title: Text('最大宽度、页脚和滚动数据'),
          ),
          Divider(),
          // 点击跳转到可拖拽关闭面板示例
          ListTile(
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => DismissibleExample()),
              );
            },
            title: Text('可拖拽关闭的面板'),
          ),
          Divider(),
          // 点击跳转到模态面板示例
          ListTile(
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => ModalPanelExample()),
              );
            },
            title: Text('模态面板'),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


sliding_panel 是一个 Flutter 插件,用于创建滑动面板效果,类似于 Google Maps 中的底部面板。它可以帮助你在应用中实现可滑动的面板,用户可以通过上下滑动来展开或收起面板。

安装

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

dependencies:
  flutter:
    sdk: flutter
  sliding_panel: ^1.0.0  # 请使用最新的版本

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

基本用法

以下是一个简单的示例,展示如何使用 sliding_panel 插件:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Sliding Panel Example'),
        ),
        body: SlidingPanelExample(),
      ),
    );
  }
}

class SlidingPanelExample extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Stack(
      children: [
        // 主内容
        Center(
          child: Text('Main Content'),
        ),

        // 滑动面板
        SlidingPanel(
          panelMinSize: 100.0,
          panelMaxSize: 300.0,
          panelBuilder: (ScrollController scrollController) {
            return ListView(
              controller: scrollController,
              children: [
                ListTile(title: Text('Item 1')),
                ListTile(title: Text('Item 2')),
                ListTile(title: Text('Item 3')),
                ListTile(title: Text('Item 4')),
                ListTile(title: Text('Item 5')),
              ],
            );
          },
        ),
      ],
    );
  }
}

参数说明

  • panelMinSize: 面板的最小高度。
  • panelMaxSize: 面板的最大高度。
  • panelBuilder: 构建面板内容的回调函数,接收一个 ScrollController,用于控制面板内部的滚动。

自定义

你可以通过以下方式自定义滑动面板的行为和外观:

  1. 面板背景颜色:可以通过 panelBuilder 返回的 Container 来设置背景颜色。

  2. 面板动画SlidingPanel 提供了 panelController,你可以通过它来控制面板的展开和收起。

  3. 面板边缘效果:可以通过 borderRadius 参数来设置面板的圆角。

示例:控制面板展开和收起

class SlidingPanelExample extends StatefulWidget {
  [@override](/user/override)
  _SlidingPanelExampleState createState() => _SlidingPanelExampleState();
}

class _SlidingPanelExampleState extends State<SlidingPanelExample> {
  PanelController _panelController = PanelController();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Stack(
      children: [
        Center(
          child: Text('Main Content'),
        ),
        SlidingPanel(
          panelMinSize: 100.0,
          panelMaxSize: 300.0,
          panelController: _panelController,
          panelBuilder: (ScrollController scrollController) {
            return ListView(
              controller: scrollController,
              children: [
                ListTile(title: Text('Item 1')),
                ListTile(title: Text('Item 2')),
                ListTile(title: Text('Item 3')),
                ListTile(title: Text('Item 4')),
                ListTile(title: Text('Item 5')),
              ],
            );
          },
        ),
        Positioned(
          bottom: 20,
          right: 20,
          child: FloatingActionButton(
            onPressed: () {
              if (_panelController.isPanelShown) {
                _panelController.hide();
              } else {
                _panelController.show();
              }
            },
            child: Icon(Icons.swap_vert),
          ),
        ),
      ],
    );
  }
}
回到顶部