首页 > 其他分享 >Flutter开发Don't use 'BuildContext's across async gaps警告

Flutter开发Don't use 'BuildContext's across async gaps警告

时间:2023-10-22 11:01:29浏览次数:41  
标签:异步 use Don Context 部件 BuildContext context 上下文

问题

Flutter开发中遇到Don't use 'BuildContext's across async gaps警告

有问题的源码

    if (await databaseHelper.isDataExist(task.title)) {
      showDialog(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            title: Text("已存在同名配置"),
            content: Text("是否覆盖已有的配置?"),
            actions: <Widget>[
              ElevatedButton(
                child: const Text("取消"),
                onPressed: () {
                  Navigator.of(context).pop();
                },
              ),
              ElevatedButton(
                child: const Text("确认"),
                onPressed: () async {
                  Navigator.of(context).pop();
                  databaseHelper.updateDatabaseByTitle(task);
                },
              ),
            ],
          );
        },
      );
    }

问题原因

"不要在异步间隙(async gaps)中使用 BuildContext" 是一个Flutter中的常见警告消息,通常表示你正在尝试在异步操作中访问 BuildContext,这是一个不推荐的做法,因为它可能引发不确定的行为或错误。 如果在将上下文传递给AlertDialog后导航堆栈发生更改,并且尝试使用旧上下文再次导航,则会出现错误。

问题分析

Context的含义

Flutter中的 BuildContext 和 Context 是相同的,BuildContext 是 Context 的别名。这两个术语用来表示小部件树中的位置信息和上下文环境,用于在构建小部件树和访问资源(例如主题、本地化、导航等)时提供上下文信息。

在Flutter中,BuildContext 或 Context 表示的是一个由小部件树组成的层次结构中的位置。每个小部件都有一个与之相关的 BuildContext,这个上下文包含有关小部件的信息,例如其位置、父级小部件、主题数据等等。

尽管 Context 和 BuildContext 是相同的类型,但通常我们更倾向于使用 BuildContext 这个术语,因为它更明确地表示它是与构建过程相关的上下文。

BuildContext的作用

BuildContext 类型通常用于以下操作:

  • 访问父级小部件:你可以使用 BuildContext 访问小部件树中的父级小部件,这对于在小部件之间传递数据和状态非常有用。

  • 获取主题数据:通过 BuildContext 可以访问当前主题的数据,如颜色、字体、间距等。

  • 获取本地化信息:你可以使用 BuildContext 获取本地化信息,以根据用户的语言偏好来显示文本。

  • 导航:BuildContext 通常用于导航操作,如推送新路由或弹出对话框。

  • 构建小部件:BuildContext 是在小部件的 build 方法中传递的,它告诉小部件在小部件树中的位置。

BuildContext 和 Context 都代表了小部件树中的位置和上下文信息,它们在构建和交互中扮演着关键的角色,但它们实际上是相同的概念的不同表达方式。因此,你可以放心地将它们视为等同的,使用其中一个作为标识符,以便更清晰地表示其作用。

特殊情况

然而,在某些情况下,你可能需要在异步操作中访问 BuildContext,例如在异步回调中执行 UI 操作。这通常是不安全的,因为异步操作可能会在 BuildContext 不再有效的情况下执行,从而引发错误。

解决方法

image.png

使用

                    if (context.mounted) Navigator.of(context).pop();

不要在异步间隙中直接使用 BuildContext,因为它可能会导致不安全的操作。使用提供的方法来安全地查找小部件并在异步操作中访问它们的上下文。这可以帮助你避免潜在的问题和错误。

标签:异步,use,Don,Context,部件,BuildContext,context,上下文
From: https://blog.51cto.com/u_15777557/7974738

相关文章

  • could not chdir to home directory /home/user:permission denied /bin/bash:Permiss
    今天在vm上登录一个user的时候,发现正确输入用户名和密码后弹出了这样的信息,登陆不上.发现给出的信息中,permissiondenied而binpermiss;这种情况表明自己给该用户赋予的权限不足导致问题通过在/home目录下用ll检查到该用户的user权限是---通过chmod7user指令修改后仍......
  • House of force以及相关例题学习
    学习于:(1)https://bbs.kanxue.com/thread-262114.htm(2):https://www.cnblogs.com/ZIKH26/articles/16533388.html以及经典的wiki:https://ctf-wiki.org/pwn/linux/user-mode/heap/ptmalloc2/house-of-force/(可能我的文章会与他们有部分重合因为我是一步步跟着调试进行,如有问题请联......
  • 还原数据库从远端环境到本地开发环境,数据SINGLE_USER问题
    要还原到本地开发环境,首先要detach本地数据库或者是删除本地数据库,不然提示在使用中还原不了,但是搞过几次去做detach和drop数据库时,总是不成功,最后还出现个单用户模式,莫名奇妙为此网上搜索了一篇处理SINGLE_USER模式的文章,记录下,SQLServer数据库单用户模式处理_51CTO博客_sqls......
  • Flutter的Invalid use of a private type in a public API警告
    问题描述自己在写Flutter应用时发现了一个InvaliduseofaprivatetypeinapublicAPI警告。发现很多官方的例子也有这个问题。有问题的源码有问题的源码如下:classMyTabPageextendsStatefulWidget{constMyTabPage({super.key});@override_MyTabPageState......
  • You must reset your password using ALTER USER statement before executing this st
    安装mysql-5.7.32数据库时,初次登陆MySQL,执行如下命令获取临时密码,/var/log/mysqld.log为my.cnf中log-error配置项的内容:grep'temporarypassword'/var/log/mysqld.log获取临时密码:!.IRoNewC7xq,执行结果如下: 初次使用临时密码登录MySQL,查看MySQL数据库时......
  • Pixie: A System for Recommending 3+ Billion Items to 200+ Million Users in Real-
    目录概符号说明PixieEksombatchaiC.,JindalP.,LiuJ.Z.,LiuY.,SharmaR.,SugnetC.,UlrichM.andLeskovecJ.Pixie:Asystemforrecommending3+billionitemsto200+millionusersinreal-time.WWW,2018.概Pinterest的一个大规模处理图的方案(偏推理......
  • clickhouse常用的函数整理
    转:https://blog.csdn.net/m0_37899908/article/details/118531285一、检测函数类型(clickhouse中数据的类型)SELECTtoTypeName(0);--UInt8(三位数为8)SELECTtoTypeName(-0);--Int8SELECTtoTypeName(-343);--Int16SELECTtoTypeName(12.43);--Float64(默认浮点型的数据......
  • docker exec 报错 decoding init error from pipe caused \"read parent: connection
    复现方法,限制容器内pid个数dockerrun--pids-limit=1000 -dcentossleep100000dockerexec-itidbash  3.执行 foriin $(seq12000);do(sleep100&);done[root@host-226~]#dockerstatseaecCONTAINER      CPU%      ......
  • 29、Flink SQL之DESCRIBE、EXPLAIN、USE、SHOW、LOAD、UNLOAD、SET、RESET、JAR、JOB
    文章目录Flink系列文章四、SHOW语句1、java示例2、FlinkSQLcli示例3、showtables1)、语法2)、示例4、SHOWCREATETABLE5、SHOWCOLUMNS1)、语法2)、示例6、SHOWJARS7、SHOWJOBS五、LOAD语句1、语法2、Java示例3、FlinkSQLCli示例六、UNLOAD语句1、语法2、java示例3、Flink......
  • 29、Flink SQL之DESCRIBE、EXPLAIN、USE、SHOW、LOAD、UNLOAD、SET、RESET、JAR、JOB
    Flink系列文章1、Flink部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接13、Flink的tableapi与sql的基本概念、通用api介绍及入门示例14、Flink的tableapi与sql之数据类型:内置数据类型以及它们的属性15、Flink的tableapi与s......