【交互 widget】Flutter Dialog

简介: 【交互 widget】Flutter Dialog

image.png

Dialog 是 material 风格的 widget。Dialog 定义了 最基本的属性。可以直接使用 Dialog 自定义 Dialog 的内容。

源码分析

Dialog 是一个 StatelessWidget widget ,所以只要了解他都组合了哪些 widget ,都起到了什么作用就好了。

dialog 样式

dialog 的样式 主要有三个属性 backgroundColor,elevation,shape,分别对应背景色,阴影和形状。 最后决定属性值的是 参数,dialogTheme 和 defaults。

build 方法的前三句就是取样式的。

final ThemeData theme = Theme.of(context);
final DialogTheme dialogTheme = DialogTheme.of(context);
final DialogTheme defaults = theme.useMaterial3 ? _DialogDefaultsM3(context) :
复制代码

dialog 自身的参数优先级最高,其次是 dialogTheme 最后是 defaults。你可能会疑问,后面两个值是哪里来的?

如果是全局的样式,可以在 MaterialApp 定义

MaterialApp(
      theme: ThemeData(
        dialogTheme: DialogTheme(
        alignment: Alignment.center,
        elevation: 6.0,
        shape: const RoundedRectangleBorder(
            borderRadius: BorderRadius.only(
                topLeft: Radius.circular(28.0),
                topRight: Radius.circular(28.0),
                bottomLeft: Radius.circular(28.0),
                bottomRight: Radius.circular(28.0))))))
复制代码

在 Dialog 的父级,用 Theme widget 也可以定义 dialogTheme。

如果没有定义 dialogTheme,会用默认值。_DialogDefaultsM3_DialogDefaultsM2 都是 DialogTheme 的子类。规定了 Material Design 2 和 Material Design 3 的默认值。

useMaterial3 是一个临时变量,一旦 Design 3 成为稳定版,就都会使用 Design 3,useMaterial3 会被删除。

size

constraints: const BoxConstraints(minWidth: 280.0),
复制代码

dialog的最小宽度是280。高度根据内容自适应,一般不需要设置 dialog 的高度,除非内容太多,需要限制最大高度。

手机的宽度 一共也就 400 左右,最小宽度已经 限制为 280了,还得有 padding,所以宽度方面再大也很有限了,如果有精确匹配 child 宽度的需要,可以用 IntrinsicWidth 把 child 包起来。

如果想要宽度 小于 280,用 insetPadding 参数。

动画效果

final EdgeInsets effectivePadding = MediaQuery.of(context).viewInsets + (insetPadding ?? EdgeInsets.zero);
    return AnimatedPadding(
      padding: effectivePadding,
      duration: insetAnimationDuration,
      curve: insetAnimationCurve,
     ...
复制代码

最外层是用 AnimatedPadding 包裹的,它的用处主要是当 键盘弹起的时候,可以通过动画的方式让 dialog 向上弹起。viewInsets.bottom 的值是键盘的高度。可以通过参数 insetAnimationDuration 定义动画的 时间,参数 insetAnimationCurve 自定义动画的缓动曲线。

从这里可以看出,如果我们要改变 dialog 的大小,最好通过改变参数 insetPadding 的方式,因为这样会有动画效果。

使用 Dialog

源码已经分析完了,通过一个实例来看下如何用 Dialog。

showDialog(
  context: context,
  builder: (context) {
    return Dialog(
      child: Container(
       height: 200,
         color: Colors.green,
         child: ElevatedButton(
           child:const Text('close'),
           onPressed: () {
             Navigator.of(context).pop();
           },
         )),
   );
 });
复制代码

使用 showDialog 显示 dialog,用 Navigator.of(context).pop(); 关闭 dialog。

Dialog 只是一个空壳,里面的内容可以完全自定义。

AlertDialogSimpleDialog,是 Dialog 的子类,如果你的需求正好和他们匹配,也可以使用它们。

如果内容过高,用 SingleChildScrollView 包起来。

Dialog 只是 StatelessWidget,如果 child 需要保持状态用 StatefulWidget 包起来。

目录
相关文章
|
2天前
|
容器
Flutter Widget 解析
Flutter Widget 解析
|
2天前
|
存储 容器
Flutter 有状态Widget 和 无状态Widget
Flutter 有状态Widget 和 无状态Widget
|
1月前
深入理解Flutter鸿蒙next版本 中的Widget继承:使用extends获取数据与父类约束
本文详细介绍了Flutter中如何通过继承其他Widget来创建自定义组件。首先解释了Widget继承的基本概念,包括StatelessWidget和StatefulWidget的区别。接着通过具体示例展示了如何继承StatelessWidget和StatefulWidget,并在子类中访问父类的build方法和状态。最后,结合多个自定义Widget展示了如何在实际应用中灵活使用继承和组合来构建复杂的UI。
76 8
|
1月前
|
容器
flutter&鸿蒙next 使用 InheritedWidget 实现跨 Widget 传递状态
在 Flutter 中,状态管理至关重要。本文详细介绍了如何使用 InheritedWidget 实现跨 Widget 的状态传递。InheritedWidget 允许数据在 Widget 树中向下传递,适用于多层嵌套的场景。通过一个简单的计数器示例,展示了如何创建和使用 InheritedWidget,包括其基础概念、工作原理及代码实现。虽然 InheritedWidget 较底层,但它是许多高级状态管理解决方案的基础。
103 2
|
1月前
|
Dart UED 开发者
Flutter&鸿蒙next中的按钮封装:自定义样式与交互
在Flutter应用开发中,按钮是用户界面的重要组成部分。Flutter提供了多种内置按钮组件,但有时这些样式无法满足特定设计需求。因此,封装一个自定义按钮组件变得尤为重要。自定义按钮组件可以确保应用中所有按钮的一致性、可维护性和可扩展性,同时提供更高的灵活性,支持自定义颜色、形状和点击事件。本文介绍了如何创建一个名为CustomButton的自定义按钮组件,并详细说明了其样式、形状、颜色和点击事件的处理方法。
86 1
|
2月前
|
开发者 UED
flutter:dialog (十一)
本文介绍了 Flutter 中常用的弹窗组件和方法,包括 `AlertDialog`、`SimpleDialog`、`showModalBottomSheet` 和 `toast`。每个组件的使用方法和示例代码都进行了详细说明,帮助开发者快速理解和应用这些弹窗功能。例如,`AlertDialog` 用于显示带有标题、内容和按钮的对话框;`SimpleDialog` 用于显示多个选项供用户选择;`showModalBottomSheet` 用于从屏幕底部弹出模态对话框;而 `toast` 则用于显示短暂的消息提示。文中还提供了如何处理点击事件、取消弹窗等常见操作的代码示例。
|
2月前
|
容器
flutter:第一个flutter&Widget的使用 (二)
本文介绍了Flutter框架下的基本组件及其用法,包括简单的 Stateless Widget 如文本和按钮,以及更复杂的 StatefulWidget 示例。详细解释了如何使用 `context` 获取祖先小部件的信息,并展示了 `MaterialApp` 的属性及用途。此外,还探讨了 `StatefulWidget` 与 `StatelessWidget` 的区别,以及 `AppBar` 的常见属性配置方法。适合Flutter初学者参考学习。
|
1月前
|
Dart JavaScript 前端开发
Flutter 的 Widget 概述与常用 Widgets 与鸿蒙 Next 的对比
Flutter 是 Google 开发的开源 UI 框架,用于快速构建高性能的移动、Web 和桌面应用。Flutter 通过 Widget 构建 UI,每个 UI 元素都是 Widget,包括文本、按钮、图片等。Widget 不仅描述外观,还描述行为,是不可变的。常见的 Widget 包括结构型(Container、Column、Row)、呈现型(Text、Image)、交互型(ElevatedButton)和状态管理型(StatefulWidget)。Flutter 与鸿蒙 Next 在组件化架构、开发语言、布局系统、性能和跨平台支持方面各有优势
75 0
|
5月前
Flutter-底部弹出框(Widget层级)
文章描述了如何在Flutter中使用DraggableScrollableSheet创建一个底部弹出框,同时保持其可手势滑动关闭。作者遇到问题并提出对原控件进行扩展,以支持头部和列表布局的滑动关闭功能。
199 0
|
6月前
Flutter StreamBuilder 实现局部刷新 Widget
Flutter StreamBuilder 实现局部刷新 Widget
52 0