当前位置: 首页 > article >正文

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


http://www.kler.cn/a/386500.html

相关文章:

  • 算法——移除链表元素(leetcode203)
  • Openstack7--安装消息队列服务RabbitMQ
  • 2024 年 8 个最佳 API 设计工具图文介绍
  • 高频 SQL 50 题(基础版)连接部分
  • 【Mode Management】AUTOSAR架构下唤醒源检测函数EcuM_CheckWakeup详解
  • MySQ怎么使用语法介绍(详细)
  • 华为OD技术一面手撕题
  • 蓝牙FTP 协议详解及 Android 实现
  • RHCE---搭建lnmp云存储
  • MySQL面试遇到这三个问题,直接问懵了!
  • 苹果MacOS最常用快捷键(一)
  • Python爬虫 | 爬取豆瓣电影Top250的数据
  • 《计算机原理与系统结构》学习系列——存储器(上)
  • md5等摘要算法的「撞库」与「加盐」(Ⅰ)
  • 软考:信息安全难点再次复习
  • 如何改 Bug - 2024最新版前端秋招面试短期突击面试题【100道】
  • Excel 数据分析高级建模指南
  • 人工智能在SEO中的关键词优化技巧与策略
  • PaaS云原生:分布式集群中如何构建自动化压测工具
  • 对接世邦XC-9000 HTTP
  • 数据结构————链表
  • 论文阅读《机器人状态估计中的李群》
  • 理解鸿蒙app 开发中的 context
  • Centos 网络接口打vlan标签
  • 三周精通FastAPI:38 针对不同的编程语言来生成客户端
  • 『事善能』MySQL基础 — 2.MySQL 5.7安装(一)