【Flutter 专题】124 日常问题小结 (三) 自定义 Dialog 二三事

针对日常不同的需求,我们时常需要自定义 Dialog,而小菜在尝试过程中遇到一些小问题,简单记录总结一下;
Dialog
Q1. 软键盘遮挡含文本框对话框
小菜在自定义含有文本框的 Dialog 时,文本框获取焦点时,软键盘会部分遮挡对话框,但当小菜替换为 AlertDialog 时,文本框获取焦点时,对话框会向上浮动,避免软键盘遮挡;

A1. Scaffold & resizeToAvoidBottomInset
对于含有文本框的自定义 Dialog,小菜在最外层使用的是 Material 嵌套,小菜通过采用 Scaffold 来嵌套处理,默认 Scaffold 中 resizeToAvoidBottomPadding / resizeToAvoidBottomInset 为 true,当设置为 false 时,文本框获取焦点时,依旧会被软键盘遮挡;因为在固定情景可以配合 resizeToAvoidBottomPadding 实现是否被软键盘遮挡效果;
resizeToAvoidBottomPadding 主要用于自身 Widget 是否避免被其他窗口遮挡;其中小菜查资料介绍在 Flutter 1.1.9 之后更推荐使用 resizeToAvoidBottomInset;

Q2. 对话框进行状态更新
小菜自定义一个可以多选 item 的 Dialog,但 Dialog 中并没有状态更新的 State,如何进行 Dialog 中状态更新呢?

A2. 创建一个 StatefulBuilder 构造器
小菜之前在 showDialog 时直接创建了 TypeListDialog,此时是无状态的,当 WidgetBuilder 创建一个 StatefulBuilder 有状态的构造器即可,可以将 state 传递到 Dialog 中;

Q3. Dialog 回调传参
小菜在自定义 Dialog 时如何在一个回调方法中传递多个参数?
A3. 接收方法与 Function 传递参数匹配
小菜在 Dialog 的回调方法中传递两个 List,而在接收回调方法中匹配两个参数即可;小菜简单看作是一个函数方法;

Q4. AppBar 返回按钮
小菜在重写 AppBar 时,如何取消默认的返回按钮?

A4. Material | automaticallyImplyLeading
取消 AppBar 前面的返回图标有多种方式;
Scaffold 外层嵌套 Material;
AppBar 中的 automaticallyImplyLeading 属性设置为 false;
在动态路由跳转时 WidgetBuilder 设置为 MaterialPageRoute 方式;注意,此时 push 需要采用 pushReplacement / pushAndRemoveUntil 等方式;

小菜对于 Flutter 的应用还不够熟悉,很多常用的场景会处理的很不到位,小菜会对日常的小问题进行简单记录,逐步学习;如有错误,请多多指导!
来源: 阿策小和尚
版权声明: 本文为 InfoQ 作者【阿策小和尚】的原创文章。
原文链接:【http://xie.infoq.cn/article/b218903fffdbba92d9f4953f6】。文章转载请联系作者。
评论