dart 我如何正确地编写代码,这样我就不会得到关于在异步间隙中使用BuildContext的警告?

cwxwcias  于 2023-09-28  发布在  其他
关注(0)|答案(3)|浏览(102)

我收到一个警告说
不要在异步间隙中使用'BuildContext'。(文档)尝试重写代码以不引用'BuildContext'。
我点击了Documentation链接,并按照他们的建议添加了if (!context.mounted) return;行(见下文)。然而,我仍然得到相同的警告,虽然现在它指向我刚刚添加的行。这意味着什么?我可以做些什么来正确地编码它,使警告不出现?所有我需要这个按钮做的是运行一些异步工作,如果它是成功的,然后导航到一个不同的页面。

TextButton(
  onPressed: () async {
    final groupID = await database.createGroup();
      if (!context.mounted) return; //Warning points here
      if (groupID == '') {
        Fluttertoast.showToast(msg: 'Error creating group');
      } else {
        groupNameController.clear();
        Navigator.of(context).pop(); //Close the dialog box
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => ScreenChat(groupID: groupID,)),
        );
      }
  },
  child: const Text('OK')
),
9avjhtql

9avjhtql1#

而不是使用:

if (!context.mounted) return;

尝试使用:

if (!mounted) return;

它还将抑制警告。

v8wbuo2f

v8wbuo2f2#

而不是使用:

if (!context.mounted) return;

尝试使用:

if (context.mounted) {
} else {
  return;
}

它将抑制警告。

b09cbbtk

b09cbbtk3#

这个错误是说,当异步函数仍在加载/进行时,用户可以关闭应用程序或转到应用程序的另一个页面/屏幕,这将在完成后导致错误,因为它无法执行下一行(if/else)或检查(!context)
出于这个原因,你需要检查这个页面/屏幕是否仍然是mounted,如果是,你要求它继续执行下一行,或者关闭它。简单地这样称呼它:

onPressed: () async {
    final groupID = await database.createGroup();
      if (mounted){}
      if (groupID == '') {
        Fluttertoast.showToast(msg: 'Error creating group');
      } else {
        groupNameController.clear();
        Navigator.of(context).pop(); //Close the dialog box
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => ScreenChat(groupID: groupID,)),
        );
      }
  },

相关问题