Flutter滑动面板插件sliding_panel_pro的使用

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

Flutter滑动面板插件sliding_panel_pro的使用

插件介绍

sliding_panel_pro 是您可以在 pub.dev 上找到的最可定制的底部滑动面板。它完全按照您的需求进行设计!

特性展示

以下是 sliding_panel_pro 的一些特性展示:

Demo

控制方式 自定义方式 各种用途
Screenshot Screenshot Screenshot

您可以轻松地将内容放入面板中,自定义它并将其用于各种目的,例如:

  • 在屏幕底部显示一些持久内容。
  • 可以像 Flutter 中的 showModalBottomSheet() 一样使用,让用户进行选择。
  • 还可以像 DraggableScrollableSheet() 一样使用,并在面板内放置可滚动的内容。

如何使用 sliding_panel

请访问 Wiki 查看如何让其正常工作。

完整示例 Demo

以下是一个完整的示例代码,展示了如何使用 sliding_panel_pro 插件:

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 Examples'),
      ),
      body: ListView(
        children: <Widget>[
          ListTile(
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => SafeAreaExample()),
              );
            },
            title: Text('SafeAreaConfig'), // 示例页面1:SafeArea配置
          ),
          Divider(),
          ListTile(
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => TwoStateExample()),
              );
            },
            title: Text('Two state panel with sending result'), // 示例页面2:双状态面板
          ),
          Divider(),
          ListTile(
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => SizingExample()),
              );
            },
            title: Text('Changing panel\'s height runtime'), // 示例页面3:动态改变面板高度
          ),
          Divider(),
          ListTile(
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(
                    builder: (context) => SeparateContentExample()),
              );
            },
            title: Text('Panel without bodyContent'), // 示例页面4:没有主体内容的面板
          ),
          Divider(),
          ListTile(
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => CustomizeDemo()),
              );
            },
            title: Text('Use of PanelController, Callbacks and customization'), // 示例页面5:使用面板控制器、回调和自定义
          ),
          Divider(),
          ListTile(
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => FooterAndScroll()),
              );
            },
            title: Text('Max width, FooterWidget and PanelScrollData'), // 示例页面6:最大宽度、页脚小部件和面板滚动数据
          ),
          Divider(),
          ListTile(
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => DismissibleExample()),
              );
            },
            title: Text('Dismissible panel'), // 示例页面7:可关闭的面板
          ),
          Divider(),
          ListTile(
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => ModalPanelExample()),
              );
            },
            title: Text('Modal panel'), // 示例页面8:模态面板
          ),
        ],
      ),
    );
  }
}

// 示例页面1:SafeArea配置
class SafeAreaExample extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("SafeArea Example")),
      body: Center(child: Text("This is a SafeArea example!")),
    );
  }
}

// 示例页面2:双状态面板
class TwoStateExample extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Two State Example")),
      body: Center(child: Text("This is a two state panel example!")),
    );
  }
}

// 示例页面3:动态改变面板高度
class SizingExample extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Sizing Example")),
      body: Center(child: Text("This is a dynamic sizing example!")),
    );
  }
}

// 示例页面4:没有主体内容的面板
class SeparateContentExample extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Separate Content Example")),
      body: Center(child: Text("This is a separate content example!")),
    );
  }
}

// 示例页面5:使用面板控制器、回调和自定义
class CustomizeDemo extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Customize Demo")),
      body: Center(child: Text("This is a customize demo example!")),
    );
  }
}

// 示例页面6:最大宽度、页脚小部件和面板滚动数据
class FooterAndScroll extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Footer And Scroll Example")),
      body: Center(child: Text("This is a footer and scroll example!")),
    );
  }
}

// 示例页面7:可关闭的面板
class DismissibleExample extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Dismissible Example")),
      body: Center(child: Text("This is a dismissible panel example!")),
    );
  }
}

// 示例页面8:模态面板
class ModalPanelExample extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Modal Panel Example")),
      body: Center(child: Text("This is a modal panel example!")),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用sliding_panel_pro插件的一个基本示例。这个插件允许你创建一个可滑动的面板,非常适合实现如底部抽屉菜单或展开/收缩视图等功能。

首先,确保你的Flutter项目已经添加了sliding_panel_pro依赖。在你的pubspec.yaml文件中添加以下依赖:

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

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

接下来,你可以在你的Dart文件中使用SlidingPanelPro组件。以下是一个简单的示例,展示如何设置和使用SlidingPanelPro

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SlidingPanelHomePage(),
    );
  }
}

class SlidingPanelHomePage extends StatefulWidget {
  @override
  _SlidingPanelHomePageState createState() => _SlidingPanelHomePageState();
}

class _SlidingPanelHomePageState extends State<SlidingPanelHomePage> with SingleTickerProviderStateMixin {
  late SlidingPanelController _panelController;

  @override
  void initState() {
    super.initState();
    _panelController = SlidingPanelController();
  }

  @override
  void dispose() {
    _panelController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Sliding Panel Pro Example'),
      ),
      body: Stack(
        children: [
          // 主内容
          Container(
            color: Colors.white,
            child: Center(
              child: Text('Main Content'),
            ),
          ),
          // 滑动面板
          SlidingPanelPro(
            controller: _panelController,
            panel: Container(
              color: Colors.blue,
              child: Center(
                child: Text('Sliding Panel Content'),
              ),
            ),
            borderRadius: BorderRadius.circular(20),
            minHeight: 100,
            maxHeight: 300,
            panelColor: Colors.transparent,
            backdropColor: Colors.grey.withOpacity(0.5),
            backdropBlur: 10,
            shadowColor: Colors.black.withOpacity(0.3),
            elevation: 4,
            isDraggable: true,
            isGestureEnabled: true,
            onPanelOpened: () {
              print('Panel opened');
            },
            onPanelClosed: () {
              print('Panel closed');
            },
          ),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 通过控制器控制面板状态
          if (_panelController.isPanelClosed) {
            _panelController.openPanel();
          } else {
            _panelController.closePanel();
          }
        },
        tooltip: 'Toggle Panel',
        child: Icon(Icons.add),
      ),
    );
  }
}

代码解释:

  1. 依赖添加:确保在pubspec.yaml中添加了sliding_panel_pro依赖。
  2. 控制器初始化:在_SlidingPanelHomePageState中,我们初始化了SlidingPanelController,用于控制面板的打开和关闭。
  3. UI布局
    • 使用Stack布局将主内容和滑动面板叠加在一起。
    • SlidingPanelPro组件负责创建滑动面板,可以设置面板的最小高度、最大高度、颜色、阴影等属性。
    • 通过controller属性将控制器绑定到面板上,以便程序控制面板的状态。
  4. 按钮控制:通过浮动操作按钮(FAB)控制面板的打开和关闭状态。

这样,你就可以在Flutter应用中实现一个基本的滑动面板功能。根据需要,你可以进一步自定义面板的样式和行为。

回到顶部