【交互 widget】 Flutter BottomSheet

简介: 【交互 widget】 Flutter BottomSheet

image.png

BottomSheet 是一个 Material Design StatefulWidget。我们很少直接使用他,而是通过 showBottomSheetshowModalBottomSheet 使用他。

showBottomSheet 用法

PersistentBottomSheetController<T> showBottomSheet<T>({
  required BuildContext context,
  required WidgetBuilder builder,
  Color? backgroundColor,
  double? elevation,
  ShapeBorder? shape,
  Clip? clipBehavior,
  BoxConstraints? constraints,
  bool? enableDrag,
  AnimationController? transitionAnimationController,
})
复制代码

backgroundColor 是 bottomSheet 的背景色,默认是不透明的,要想透明可以设置为 Colors.transparent。elevation 基本上看不到什么效果,因为 elevation 大多在底下,如果不想用矩形可以指定 shape。比如指定为圆形 shape: CircleBorder(),也可以设置为圆角,shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)),圆角可能用的更多些。

image.png

showModalBottomSheet(
       context: context,
       shape: RoundedRectangleBorder(
           borderRadius:
               BorderRadius.vertical(top: Radius.circular(30))),
       builder: ((context) {
         return Container(
           decoration: BoxDecoration(
               border: Border.all(width: 3, color: Colors.green)),
           height: 100,
         );
       }));
复制代码

虽然 shape 为 圆角,但 child 仍然可以在 shape 之外绘制,好像 shape 没有设置一样。需要自己注意,在远离边缘的地方绘制 child,用 ClipRRect 也可以。

enableDrag 默认为 true,可以拖动改变 BottomSheet 的高度。一直往下拖可以让 BottomSheet 消失。如果 enableDrag 是 false 就无法拖动了。

一般情况下用默认值就可以了。showBottomSheet 默认没有 padding。

showBottomSheet(
         context: context,
         builder: ((context) {
           return Container(
             height: 300,
           );
}));
复制代码

这种由 showBottomSheet 方法弹出的 sheet  是 persistent sheet。是和 modal 相对而言的。persistent sheet 允许用户和 sheet 之外的 UI 交互,modal 不允许用户和 sheet 之外的 UI 交互。

showModalBottomSheet 用法

Future<T?> showModalBottomSheet<T>({
  required BuildContext context,
  required WidgetBuilder builder,
  Color? backgroundColor,
  double? elevation,
  ShapeBorder? shape,
  Clip? clipBehavior,
  BoxConstraints? constraints,
  Color? barrierColor,
  bool isScrollControlled = false,
  bool useRootNavigator = false,
  bool isDismissible = true,
  bool enableDrag = true,
  RouteSettings? routeSettings,
  AnimationController? transitionAnimationController,
  Offset? anchorPoint,
}) 
复制代码

与 showBottomSheet 相比,多了 barrierColor,是蒙层的颜色。不是不让用户与 sheet 之外的 UI 交互吗?办法就是蒙起来。isDismissible 为 true ,点蒙层可以关闭 sheet。anchorPoint 分屏用的,暂时用不到,分屏的场景暂时还太少了。RouteSettings 用于路由监听,因为 bottomSheet 也是一个路由。isScrollControlled 如果设置为true,当 child 为 ListView,GridView 等滚动 widget 的时候,可以全屏。

使用的时候也是直接用默认值就好了。

showModalBottomSheet(
      context: context,
      builder: ((context) {
        return Container(
          height: 300,
        );
      }));


目录
相关文章
|
1月前
Flutter-底部弹出框(Widget层级)
文章描述了如何在Flutter中使用DraggableScrollableSheet创建一个底部弹出框,同时保持其可手势滑动关闭。作者遇到问题并提出对原控件进行扩展,以支持头部和列表布局的滑动关闭功能。
70 0
|
2月前
Flutter StreamBuilder 实现局部刷新 Widget
Flutter StreamBuilder 实现局部刷新 Widget
22 0
|
3月前
|
Android开发
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
|
3月前
|
Dart 前端开发 Android开发
【Flutter前端技术开发专栏】Flutter与原生代码的集成与交互
【4月更文挑战第30天】本文探讨了如何在Flutter中集成和交互原生代码,以利用特定平台的API和库。当需要访问如蓝牙、特定支付SDK或复杂动画时,集成原生代码能提升效率和性能。集成方法包括:使用Platform Channel进行通信,借助现有Flutter插件,以及Android和iOS的Embedding。文中通过一个电池信息获取的例子展示了如何使用`MethodChannel`在Dart和原生代码间传递调用。这些技术使开发者能充分利用原生功能,加速开发进程。
72 0
【Flutter前端技术开发专栏】Flutter与原生代码的集成与交互
|
3月前
|
开发框架 前端开发 搜索推荐
【Flutter前端技术开发专栏】Flutter中的自定义Widget与渲染流程
【4月更文挑战第30天】探索Flutter的自定义Widget与渲染流程。自定义Widget是实现复杂UI设计的关键,优点在于个性化设计、功能扩展和代码复用,但也面临性能优化和复杂性管理的挑战。创建步骤包括设计结构、定义Widget类、实现构建逻辑和处理交互。Flutter渲染流程涉及渲染对象树、布局、绘制和合成阶段。实践案例展示如何创建带渐变背景和阴影的自定义按钮。了解这些知识能提升应用体验并应对开发挑战。查阅官方文档以深入学习。
49 0
【Flutter前端技术开发专栏】Flutter中的自定义Widget与渲染流程
|
3月前
|
JavaScript 前端开发 开发者
【Flutter前端技术开发专栏】Flutter中的Widget与状态管理
【4月更文挑战第30天】本文探讨了Flutter的Widget和状态管理。Widget是Flutter构建UI的基础,分为有状态和无状态两种。状态管理确保UI随应用状态变化更新,影响应用性能和可维护性。文章介绍了`setState`、`Provider`、`Riverpod`、`Bloc`和`Redux`等状态管理方法,并通过计数器应用展示了其实现。选择合适的状态管理策略对高效开发至关重要。
37 0
【Flutter前端技术开发专栏】Flutter中的Widget与状态管理
|
3月前
|
编解码 算法 开发者
Flutter的布局系统:深入探索布局Widget与布局原则
【4月更文挑战第26天】Flutter布局系统详解,涵盖布局Widget(Row/Column、Stack、GridView/ListView、CustomSingleChildLayout)和布局原则(弹性布局、约束优先、流式布局、简洁明了)。文章旨在帮助开发者理解并运用Flutter的布局系统,创建适应性强、用户体验佳的界面。通过选择合适的布局Widget和遵循原则,可实现复杂且高效的UI设计。
|
3月前
|
前端开发 开发者 UED
Flutter的自定义Painter:深入探索自定义绘制Widget的技术实现
【4月更文挑战第26天】Flutter的自定义Painter允许开发者根据需求绘制独特UI,通过继承`CustomPaint`类和重写`paint`方法实现。在`paint`中使用`Canvas`绘制图形、路径等。创建自定义Painter类后,将其作为`CustomPaint` Widget的`painter`属性使用。此技术可实现自定义形状、渐变、动画等复杂效果,提升应用视觉体验。随着Flutter的进化,自定义Painter将提供更丰富的功能。
|
3月前
|
开发框架 搜索推荐 Android开发
Flutter的Widget基础:概念、分类与深入探索
【4月更文挑战第26天】Flutter Widget详解:基础、分类与工作原理。Widget是Flutter UI的核心,描述界面外观而非直接渲染。分为基础、布局、可滚动及状态管理四大类。基于响应式编程,状态变化时自动更新UI。了解其概念、分类和原理,能助开发者高效构建精美应用。随着Flutter生态发展,Widget系统潜力无限。
|
11月前
|
Dart 前端开发 开发工具
谷歌移动UI框架Flutter教程之Widget
谷歌移动UI框架Flutter教程之Widget