Flutter重叠面板管理插件overlapping_panels的使用

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

Flutter重叠面板管理插件overlapping_panels的使用

插件介绍

overlapping_panels 是一个用于在Flutter应用中添加类似Discord风格导航的插件。它允许用户通过点击按钮来切换不同的面板。

安装和使用示例

首先,你需要在你的项目中安装这个插件。打开终端并运行以下命令:

flutter pub add overlapping_panels

接下来,我们来看一下如何在代码中使用这个插件。

示例代码

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

class _MyHomePageState extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Stack(
      childrenBuilder: (context, child) {
        return OverlappingPanels(
          // 使用Builder widget是可选的。你可以直接传递你的Widget。
          // 但是如果你想使用 `OverlappingPanels.of(context)`,你需要将你的Widget包裹在一个Builder中。
          left: Builder(builder: (context) {
            return constLeftPage();
          }),
          right: Builder(
            builder: (context) => constRightPage(),
          ),
          main: Builder(
            builder: (context) {
              return constMainPage();
            },
          ),
          onSideChange: (side) {
            setState(() {
              if (side == RevealSide.main) {
                // 隐藏一些东西
              } else if (side == RevealSide.left) {
                // 显示一些东西
              }
            });
          },
        );
      },
    );
  }
}

// 左侧页面示例
Widget constLeftPage() {
  return Container(
    color: Colors.blue,
    width: 200.0,
    height: 100.0,
    child: Text('左侧页面'),
  );
}

// 右侧页面示例
Widget constRightPage() {
  return Container(
    color: Colors.red,
    width: 250.0,
    height: 150.0,
    child: Text('右侧页面'),
  );
}

// 主页面示例
Widget constMainPage() {
  return Container(
    color: Colors.green,
    width: 300.0,
    height: 200.0,
    child: Text('主页面'),
  );
}

使用说明

  1. 创建面板:定义你想要显示的各个面板。每个面板都可以是一个单独的Container或其他任何Widget。
  2. 设置回调函数:通过onSideChange参数为每个面板设置一个回调函数。当某个面板被隐藏或显示时,该回调函数会被调用。
  3. 触发面板切换:可以通过点击按钮来触发面板的切换。例如,可以使用IconButton来实现这一点。

示例演示

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

class _MainPageState extends State<MainPage> with SingleTickerProviderStateMixin {
  late AnimationController _animationController;

  [@override](/user/override)
  void initState() {
    super.initState();
    _animationController = AnimationController(vsync: this);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Overlapping Panels Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {
                if (_animationController.isRunning) {
                  _animationController.reverse();
                } else {
                  _animationController.forward();
                }
              },
              child: Text('切换面板'),
            ),
            SizedBox(height: 20),
            OverlappingPanels(
              left: Builder(builder: (context) {
                return const LeftPage();
              }),
              right: Builder(
                builder: (context) =&gt; const RightPage(),
              ),
              main: Builder(
                builder: (context) {
                  return const MainPage();
                },
              ),
              onSideChange: (side) {
                setState(() {
                  if (side == RevealSide.main) {
                    // hide something
                  } else if (side == RevealSide.left) {
                    // show something
                  }
                });
              },
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何使用Flutter的overlapping_panels插件来实现重叠面板管理的代码案例。overlapping_panels插件允许你创建可拖动的重叠面板,非常适合需要侧边栏或底部抽屉导航的应用。

首先,确保你已经在pubspec.yaml文件中添加了overlapping_panels依赖:

dependencies:
  flutter:
    sdk: flutter
  overlapping_panels: ^2.0.0  # 请使用最新版本号

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

接下来是一个简单的示例代码,展示如何使用OverlappingPanels来创建一个可拖动的侧边面板:

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

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {
  OverlappingAnimationController? _controller;

  @override
  void initState() {
    super.initState();
    _controller = OverlappingAnimationController(
      vsync: this,
      duration: const Duration(milliseconds: 300),
    )..addListener(() {
        setState(() {}); // 当动画改变时,更新UI
      });
  }

  @override
  void dispose() {
    _controller?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Overlapping Panels Demo'),
      ),
      body: Stack(
        children: [
          // 背景内容
          Positioned.fill(
            child: Center(
              child: Text(
                'Main Content',
                style: TextStyle(fontSize: 24),
              ),
            ),
          ),
          // 重叠面板
          OverlappingPanel(
            controller: _controller!,
            body: Container(
              color: Colors.grey[200],
              child: Padding(
                padding: const EdgeInsets.all(16.0),
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Text(
                      'Panel Content',
                      style: TextStyle(fontSize: 24),
                    ),
                    SizedBox(height: 20),
                    ElevatedButton(
                      onPressed: () {
                        // 关闭面板
                        _controller!.close();
                      },
                      child: Text('Close Panel'),
                    ),
                  ],
                ),
              ),
            ),
            panelKey: UniqueKey(), // 必须提供一个唯一的Key
            borderRadius: BorderRadius.circular(16),
            backdropColor: Colors.transparent,
            minHeight: 200,
            maxHeight: MediaQuery.of(context).size.height * 0.7,
            isDraggable: true,
          ),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 打开面板
          _controller!.open();
        },
        tooltip: 'Open Panel',
        child: Icon(Icons.menu),
      ),
    );
  }
}

在这个示例中:

  1. 我们创建了一个OverlappingAnimationController来管理面板的动画。
  2. 使用OverlappingPanel小部件来创建可拖动的重叠面板。
  3. 面板的内容是一个简单的Container,包含一个文本和一个关闭按钮。
  4. 通过点击浮动操作按钮(FAB),可以打开面板;面板内部有一个按钮用于关闭面板。

这个示例展示了基本的重叠面板管理功能,你可以根据需要进一步自定义和扩展这个示例。

回到顶部