【Flutter】关于对话框showDialog传入context无效问题
- 当执行异步操作,或者从下一个页面返回结果时,需要调用类似如下加载对话框代码,有时就会出现不能展示的问题,调式发现传入的
context
是无效的
/*** showLoading()* 加载对话框*/Future<T?> showLoadingAlert<T>(BuildContext context, Function task) async {return await showDialog<T>(context: context, builder: (context) {(() async {Navigator.of(context).pop(await task(context));})();return UnconstrainedBox(child: SizedBox(width: 200,child: AlertDialog(content: Column(mainAxisSize: MainAxisSize.min,children: const [CircularProgressIndicator(),Padding(padding: EdgeInsets.only(top: 20),child: Text("加载中..."),),],),),),);}, barrierDismissible: false);}
- 如果想通过这样添加判断
mounted
解决,就会觉得实在不妥,因为这样不能保证顺利执行下去
if (!mounted) {print('$c not mounted!');//...} else {var result = await showLoadingAlert(context, () async {//handler task});//...;}
- 查过网上的资料,最后整理出来,改成如下这样试试,注意到
MyPage
页面代码中有定义了stateKey
,最后赋值给key
了,
class MyPage extends StatelessWidget with MixWidget {final stateKey = GlobalKey<ScaffoldState>();@overrideWidget build(BuildContext context) {return Scaffold(key: stateKey,//...}}//...Future<T?> showLoadingAlert<T>(Function(BuildContext context) task) async {return await showDialog<T>(context: stateKey.currentContext!, builder: (context) {(() async {Navigator.of(context).pop(await task(context));})();return UnconstrainedBox(child: SizedBox(width: 200,child: AlertDialog(content: Column(mainAxisSize: MainAxisSize.min,children: const [CircularProgressIndicator(),Padding(padding: EdgeInsets.only(top: 20),child: Text("加载中..."),),],),),),);}, barrierDismissible: false);}//...
}
- 运行以后,代码如下,只要调用
showLoadingAlert()
方法,不再传入context
,就能展示加载对话框了
onClick() async {var result = await showLoadingAlert(() async {//执行耗时请求//...});//...;
}
- 最后,附上运行结果截图
【Flutter】关于对话框showDialog传入context无效问题相关推荐
- Flutter:Dialog对话框及自定义Dialog
基本属性介绍 几个自带的dialog用法和属性基本一致,只是部分参数不同 const AlertDialog({Key? key,this.title, //对话框标题组件this.titlePadd ...
- Flutter dialog (1) - showDialog的讲解
在应用开发中,或多或少都会遇到需要弹框的问题, 比如:需要用户确认,需要输入一些信息等等的问题,这就要用到 dialog 相关的概念了 而在 flutter 中,所有可以看见的都是 Widget,di ...
- Flutter系列之showDialog拦截返回键
Flutter中弹出对话框是使用showDialog函数,如果想拦截返回键,不想其点击返回键的时候消失, 就要嵌套一层WillPopScope,示例代码如下: showDialog(context: ...
- Flutter进阶—质感设计之持久底部面板
持久性底部面板可以用于补充应用主要内容的信息,即使用户与应用程序的其他控件进行互动,也仍然可以看到持久的底部面板.可以使用Scaffold.showBottomSheet函数创建和显示持久性底部面板. ...
- Flutter AlertDialog弹框的基本使用、Flutter showDialog方法使用概述
优美的应用体验 来自于细节的处理,更源自于码农的自我要求与努力,当然也需要码农年轻灵活的思维,不局限于思维,不局限语言限制,才是编程的最高境界. 在Flutter中使用 AlertDialog 来构建 ...
- Flutter中各种对话框的使用
Flutter提供了多种对话框组件供开发者使用,以下代码中演示了常见对话框的实现,供大家参考,欢迎大家复制粘贴和吐槽. import 'package:flutter/material.dart'; ...
- Flutter对话框
AlertDialog const AlertDialog({Key key,this.title, //标题this.titlePadding, // 标题内边距this.titleTextStyl ...
- Flutter 学习 - Widget 之 对话框
前言 本篇我们介绍Flutter中常用的对话框,先看下效果图 正文 Flutter 中对话框也是Widget,有两种显示对话框的方法,对于对画框对使用还有特殊要求,我们后面介绍,先来看下这两种方法 1 ...
- 如何在Android上显示警报对话框?
我想显示一个对话框/弹出窗口,并向用户显示"您确定要删除此条目吗?"的消息. 一个带有"删除"按钮. 触摸Delete ,它应删除该条目,否则不删除任何条目. ...
最新文章
- 自定义配置webpack打包文件
- A Guide to Python's Magic Methods
- ABAP 并发执行的威力
- java反射--注解的定义与运用以及权限拦截
- eclipse 增加php 版本号,扩充eclipse php的代码提示功能
- python 读写 json文件
- c语言入口参数和出口参数,麻烦帮忙指出一下这个函数的入口参数和出口参数呀!...
- 如何自己找数据分析项目来做?
- varnish与squid的比较
- UITextField使用的一些细节
- linux发布成服务,linux服务简单部署
- 大数据公司挖掘数据价值的49个典型案例(值得收藏)
- [娱乐]华为HWT文件手动修改字体名称
- 天天生鲜项目——商品详情页
- 普元eos使用svn_普元EOS SVN配置
- DM6437 平台概况
- 1、ZigBee 开发教程之基础篇—ZigBee简介和学习方法
- 关联规则分析(频繁项集查找方法为apriori方法的Fk-1*Fk-1)
- 【Unity VR开发窍门】如何在Unity中以VR视角捕捉游戏360度全景
- 创意非凡--找到许多人熟视无睹的宝藏!
热门文章
- css字体设置透明度,CSS字体透明度怎么设置?
- java毕业设计智能医疗推荐系统Mybatis+系统+数据库+调试部署
- linux40t分区格式化,RedHat/CentOS ext4无法格式化大分区 补充ext4格式化方式
- 难以想象,25 年前互联网大佬在最原始的论坛冲浪!
- consul集群安装以及服务的注册和发现
- android_基础_inflater.inflate()参数详解
- 和直男程序员谈恋爱太难了
- windows系统下如何使用python定时任务
- 微信上线新功能“拍一拍”很有趣!iOS修改微信号
- 鲍捷 | 深度解析知识图谱发展关键阶段及技术脉络