草庐IT

Flutter 之 BottomSheet (五十八)

maskerII 2023-03-28 原文

1. BottomSheet

BottomSheet 作为组件直接使用的时候比较少,比如配合 Scaffold 的子属性使用,可以理解为展示在屏幕下方的一个组件。

BottomSheet 定义

  const BottomSheet({
    Key? key,
    this.animationController,
    this.enableDrag = true,
    this.onDragStart,
    this.onDragEnd,
    this.backgroundColor,
    this.elevation,
    this.shape,
    this.clipBehavior,
    this.constraints,
    required this.onClosing,
    required this.builder,
  })

1.1 属性介绍

BottomSheet 属性 介绍
animationController 动画控制器
enableDrag 是否可以拖动,默认为 true
onDragStart 开始拖拽回调,没有找到具体使用场景,后续更新
onDragEnd 结束拖拽回调,没有找到具体使用场景,后续更新
backgroundColor 背景色
elevation 阴影高度
shape 形状 BorderShape
clipBehavior 剪切方式
constraints BoxConstraints 约束
onClosing 关闭回调函数
builder 构建函数

1.2 示例


class MSBottomSheetDemo1 extends StatelessWidget {
  const MSBottomSheetDemo1({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("bottomSheet")),
      body: Center(
        child: Text("BottomSheetDemo"),
      ),
      bottomSheet: BottomSheet(
        enableDrag: false, //是否可以拖动,默认为 true
        onClosing: () {},
        builder: (ctx) {
          return Container(
            color: Colors.cyan,
            height: 200,
            alignment: Alignment.center,
            child: Text("bottomSheet in Scaffold"),
          );
        },
      ),
    );
  }
}

image.png

2. showModalBottomSheet

showModalBottomSheet 是一个直接调起 BottomSheet 的 api,使用频率较高。


class MSBottomSheetDemo2 extends StatelessWidget {
  const MSBottomSheetDemo2({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("BottomSheetDemo")),
      body: Center(
        child: Text("Demo"),
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.pets),
        onPressed: () {
          showModalBottomSheet(
            context: context,
            builder: (ctx) {
              return Container(
                height: 100,
                child: Text("Bottom Sheet"),
              );
            },
          );
        },
      ),
    );
  }
}

80.gif

示例2


class MSBottomSheetDemo4 extends StatelessWidget {
  const MSBottomSheetDemo4({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("BottomSheetDemo")),
      body: Center(
        child: Text("Demo"),
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.pets),
        onPressed: () {
          showModalBottomSheet(
            context: context,
            builder: (ctx) {
              return Container(
                height: 100,
                child: Column(
                  children: [
                    TextButton(
                      onPressed: () {
                        Navigator.of(context).pop();
                      },
                      child: Text("保存"),
                    ),
                    TextButton(
                      onPressed: () {
                        Navigator.of(context).pop();
                      },
                      child: Text("取消"),
                    ),
                  ],
                ),
              );
            },
          );
        },
      ),
    );
  }
}

82.gif

收起上拉框

Navigator.pop(context);

3. showBottomSheet

showBottomSheet 对新手可能不太友好,它的实际调用是 Scaffold.of(context).showBottomSheet,.of(context) 方法在当前同一层级是拿不到 Scaffold Widget 的,所以会报错。需要在封装一层 class 进行使用 或者 使用Builder


class MSBottomSheetDemo3 extends StatelessWidget {
  MSBottomSheetDemo3({Key? key}) : super(key: key);

  var _isShow = false;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("BottomSheetDemo")),
      body: Center(
        child: Text("Hello World"),
      ),
      floatingActionButton: _buildFloatingActionButton(),
    );
  }

  Widget _buildFloatingActionButton() {
    return Builder(
      builder: (context) {
        return FloatingActionButton(
          child: Icon(
            Icons.pets,
          ),
          onPressed: () {
            _floatingActionButtonEvent(context);
            _isShow = !_isShow;
          },
        );
      },
    );
  }

  _floatingActionButtonEvent(BuildContext context) {
    if (_isShow) {
      Navigator.of(context).pop();
    } else {
      _showSheet(context);
    }
  }

  void _showSheet(BuildContext context) {
    showBottomSheet(
      context: context,
      builder: (ctx) {
        return Container(
          width: double.infinity,
          height: 200,
          color: Colors.cyan,
          alignment: Alignment.center,
          child: Text("BottomSheet"),
        );
      },
    );
  }
}

81.gif

收起上拉框

Navigator.pop(context);

https://www.jianshu.com/p/72a999bfc09f

有关Flutter 之 BottomSheet (五十八)的更多相关文章

  1. Flutter 环境变量配置和flutter doctor中的错误解决 - 2

    一、环境变量右键点击我的电脑-属性:然后找到环境变量 1.Android的SDK不在C盘的话需要额外配这个到用户环境变量:ANDROID_HOMED:\AndroidSDK2.然后在系统变量:Path中添加一条这样的值        D:\Flutter\flutter\bin             这个值写flutter包解压的实际地址即可 3.在系统变量中添加两个镜像变量:        变量名:FLUTTER_STORAGE_BASE_URL      变量值:https://storage.flutter-io.cn        变量名:PUB_HOSTED_URL      变量

  2. 学习数据结构的手册1---五十万字总结阅读数据结构(用c语言描述+包含三大主流教材+考研工作均可+正在更新) - 2

    声明**本文档不做任何商业用途,是作者个人与团队的学习数据结构的心得笔记以及在考研备考中的学习回顾,加以整理,仅用于学习交流,任何人不得进行有偿销售、本文档的著作权归作者或团队所有,文中部分引用的图片说明来源,特此感谢。任何人使用本文档所述内容所衍生的风险与责任均由其自行承担,本文档的作者或团队不承担任何因此产生的直接或间接损失或责任。同时,本文档的内容仅代表作者或团队的观点和理解,并不代表其他任何组织或个人的观点和立场。读者在阅读和使用本文档时,请自行判断其内容的正确性、准确性和实用性,十分欢迎读者批评指正、提出建议意见,不足之处,多多包涵。**团队微信公众号:CodeLab代码实验室作者C

  3. flutter 中最详细的继承,多态,接口讲解 - 2

    flutter中最详细的继承,多态,接口讲解前言一、继承(Extends)二、混合mixins(with)2.1、最简单的mixin2.2、on关键字,基于某个类型的mixin2.3、多个mixin2.4、mixin怎么实现多继承三、接口的实现(implement)总结前言众所周知,dart是一门单继承的语言,但是我们在日常开发中,会遇到各种各样的问题,比如,我们需要在dart中实现多继承,那么改怎么办呢?本篇文章,我将和大家聊聊关于dart中的继承,接口,混合的相关知识。类型解决什么问题使用场景限制extends子类继承子类继承父类只能继承一个父类,会继承父类的可见的属性和方法,不能继承构造

  4. Flutter实现文件上传华为对象存储(OBS) - 2

      本文主要讲述在Flutter项目中如何实现将文件上传到华为OBS(对象存储)中,并封装为三方库方便灵活使用。背景介绍  在大多项目中都会存在文件上传的需求,之前的实现都是调用后台的文件上传接口将文件上传到服务器上,但是这样会存在一个问题,因为文件上传会占用带宽导致在文件上传中调用其他接口的时候就会存在访问慢的情况,解决方案当然是升级带宽或者单独使用一台服务器作为文件服务,而且要带宽足够大不然上传下载的时候会很慢,但是这样两种方案成本都比较高。随着云计算的到来,各大云服务商都提供了对象存储的服务,费用便宜、带宽高、不影响业务系统而且提供了很多附加功能,比如图片处理、图片鉴黄等功能。  因目前

  5. Flutter项目 - 2

    一、项目简介本节的学习目标是通过Flutter技术,实现仿拉勾教育App的效果。其主要的UI效果如下:二、初始化项目初始化项目fluttercreateflutter_project修改文件flutter项目/android/build.gradle,把google()和jcenter()这两行去掉。改为阿里的镜像地址。//google()//jcenter()maven{url'https://maven.aliyun.com/repository/google'}maven{url'https://maven.aliyun.com/repository/jcenter'}maven{url

  6. 在 Flutter 中使用 webview_flutter 4.0 | 基础用法与事件处理 - 2

    大家好,我是17。FlutterWebView一共写了四篇文章在Flutter中使用webview_flutter4.0|js交互FlutterWebView性能优化,让h5像原生页面一样优秀,已入选掘金一周2023.02.22期FlutterWebView如何与h5同步登录状态已入选CSDN每天值得看–2023-02-21在Flutter中使用webview_flutter4.0|基础用法与事件处理本文是第4篇,定位是新手入门,介绍和演示webview的基础用法。最后还介绍了事件处理的技巧。因为是补写的,所以本来应该首发的却发在最后了。环境准备已经在在Flutter中使用webview_fl

  7. 在flutter中使用NFC(超全) - 2

    文章前景:目前公司主要的业务方向是sass平台,我们的admin系统是基于qiankun搭建的主基座和子模块,app是flutter+h5。我主要负责的是1、qiankun基座的搭建2、flutter基座和通信jsbridge的搭建3、app内h5的书写4、模块开发规范的书写5、…在完善通信jsbridge时,发现有模块需要是需要基于nfc实现的,所以我需要完善ios与android的nfc功能在pub上看到nfc_manager反馈还不错,调查了一下,基本需求可以达到。在此,总结一下几个关键点,希望可以帮助到更多的小伙伴。一、加入插件首先,我们需要在yaml文件加入该pubdependenc

  8. Flutter局部刷新解决闪烁问题 - 2

    在开发Flutter倒计时,setState刷新会造成页面的闪烁,如图一、setState全局刷新1、setState页面问题分析在flutter中常用的刷新方法有setState,然后这个会造成整个页面刷新,特别是绘制需要时间的组件会闪烁.2、setState页面源码login_demo_page.dartimport'dart:async';import'dart:collection';import'dart:convert';import'package:flutter/material.dart';classLoginDemoPageextendsStatefulWidget{Log

  9. Android集成高德Flutter地图(三)定位 - 2

    一、集成高德地图我的项目是需要显示地图的,所以定位是在地图的基础上实现的,当然定位也可以单独实现,获取到位置相关各种信息二、集成高德定位①、集成定位基础SDK在Flutter项目中Android文件夹下的build.gradle添加implementation('com.amap.api:location:6.1.0')注意兼容性处理我这里集成的是Flutter3.0插件所以配置build.gradle为:dependencies{//高德地图Flutter插件内不包含基础SDK包,使用时请参考官网关于集成Android地图SDK和iOS地图SDK说明配置地图SDK//高德地图Flutter插

  10. Flutter高仿微信-项目实践59篇 - 2

    Flutter高仿微信(支持Android和IOS系统)Flutter高仿微信主要包含5大模块:1、Web服务器2、Flutter客户端3、Xmpp即时通讯服务器4、视频通话服务器5、腾讯云服务器另外也有Kotlin版本高仿微信功能,Kotlin版本跟Flutter同时开发,调用的是同一个服务器接口。Flutter高仿微信目录Flutter高仿微信-第1篇-注册Flutter高仿微信-第2篇-登录Flutter高仿微信-第3篇-主页Flutter高仿微信-第4篇-主页-消息Flutter高仿微信-第5篇-主页-通讯录Flutter高仿微信-第6篇-主页-我的Flutter高仿微信-第7篇-个人

随机推荐