自学内容网 自学内容网

Flutter 插件 sliding_up_panel 实现从底部滑出的面板

前言

sliding_up_panel 是一个 Flutter 插件,用于实现从底部滑出的面板。它在设计上非常灵活,能够适应多种 UI 场景,比如从底部滑出的菜单、可拖动的弹出面板等。以下是 sliding_up_panel 的详细用法,包括常用的参数说明和示例代码。

请添加图片描述

1. 基础用法

在 pubspec.yaml 中添加依赖:

dependencies:
  sliding_up_panel: ^2.0.0+1  # 确保版本最新

安装

flutter pub add sliding_up_panel

2. 基本参数说明

参数说明
panel面板的主体内容,可以是任意 Widget
collapsed面板收起状态下的显示内容。若设置此属性,面板在最小高度时会显示此内容。
minHeight面板的最小高度,默认是 100。
maxHeight面板的最大高度,默认是屏幕高度。
borderRadius面板顶部的圆角设置,通常使用 BorderRadius.vertical 来让顶部呈现圆角。
controllerPanelController,用于控制面板的开关、滚动状态。
onPanelOpened当面板完全打开时触发的回调。
onPanelClosed当面板完全关闭时触发的回调。
parallaxEnabled是否启用视差效果。
parallaxOffset视差偏移,默认 0.1,取值范围 0-1。用于设置背景视差滑动的距离。
backdropEnabled是否在面板打开时显示背景遮罩。
backdropOpacity背景遮罩的不透明度,默认是 0.5。
snapPoint设置面板滚动的吸附点,取值范围 0-1。面板可以在指定比例的高度自动停靠。

3. 使用示例

以下是一个基础的 SlidingUpPanel 示例,其中展示了如何实现基本的拖拽、点击按钮控制面板开关、以及背景遮罩等功能。

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

class SlidingUpPanelExample extends StatefulWidget {
  
  _SlidingUpPanelExampleState createState() => _SlidingUpPanelExampleState();
}

class _SlidingUpPanelExampleState extends State<SlidingUpPanelExample> {
  final PanelController _panelController = PanelController();

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Sliding Up Panel 示例'),
      ),
      body: Stack(
        children: [
          // 主页面内容
          Center(
            child: ElevatedButton(
              onPressed: () {
                _panelController.isPanelOpen
                    ? _panelController.close()
                    : _panelController.open();
              },
              child: Text('打开/关闭面板'),
            ),
          ),
          // 滑动面板
          SlidingUpPanel(
            controller: _panelController,
            minHeight: 100, // 面板最小高度
            maxHeight: MediaQuery.of(context).size.height * 0.8, // 最大高度为屏幕 80%
            borderRadius: BorderRadius.vertical(top: Radius.circular(16.0)),
            parallaxEnabled: true, // 启用视差效果
            parallaxOffset: 0.2, // 视差偏移量
            backdropEnabled: true, // 背景遮罩
            backdropOpacity: 0.5, // 背景遮罩不透明度
            panel: _buildPanelContent(), // 面板内容
            collapsed: _buildCollapsedContent(), // 收起时的显示内容
            onPanelOpened: () => print("面板已打开"),
            onPanelClosed: () => print("面板已关闭"),
          ),
        ],
      ),
    );
  }

  // 面板展开时的内容
  Widget _buildPanelContent() {
    return Column(
      children: [
        // 拖拽提示条
        GestureDetector(
          onTap: () => _panelController.close(),
          child: Container(
            margin: EdgeInsets.symmetric(vertical: 10),
            height: 5,
            width: 50,
            decoration: BoxDecoration(
              color: Colors.grey[300],
              borderRadius: BorderRadius.circular(12),
            ),
          ),
        ),
        Expanded(
          child: ListView.builder(
            itemCount: 30,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text('Item $index'),
              );
            },
          ),
        ),
      ],
    );
  }

  // 面板收起时的显示内容
  Widget _buildCollapsedContent() {
    return Container(
      decoration: BoxDecoration(
        color: Colors.blueAccent,
        borderRadius: BorderRadius.vertical(top: Radius.circular(16.0)),
      ),
      child: Center(
        child: Text(
          '向上滑动展开面板',
          style: TextStyle(color: Colors.white),
        ),
      ),
    );
  }
}

功能分析
• 面板展开/收起:点击主页面上的按钮可以控制面板的开关,通过 PanelController 实现。
• 视差效果:设置 parallaxEnabled: true 和 parallaxOffset 后,可以在面板拖动时实现背景内容的轻微移动,增添层次感。
• 背景遮罩:启用 backdropEnabled 后,面板打开时会显示半透明的遮罩层,可以通过 backdropOpacity 调整不透明度。
• 收起和展开状态的不同内容:collapsed 参数指定面板收起时显示的内容,而 panel 参数指定面板完全展开时的内容。

总结

sliding_up_panel 是一个功能丰富、设计灵活的插件,非常适合用于需要从底部滑出的面板场景。


感谢您的阅读和参与,HH思无邪愿与您一起在技术的道路上不断探索。如果您喜欢这篇文章,不妨留下您宝贵的赞!如果您对文章有任何疑问或建议,欢迎在评论区留言,我会第一时间处理,您的支持是我前行的动力,愿我们都能成为更好的自己!


原文地址:https://blog.csdn.net/lyh1083908486/article/details/143576528

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!