【交互 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 包起来。

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