繁体   English   中英

在 flutter 中使用 Snack Bar 和 Navigator 时,如何修复“不要使用 BuildContexts accros async gaps”

[英]How do I fix "Do not use BuildContexts accros async gaps" when using Snack Bar and Navigator in flutter

这是我的代码


  _signinRouter(
    userId,
    BuildContext context, {
    phone = false,
    email = false,
    googleSignUp = false,
    userData,
  }) async {
    NetworkController network = NetworkController();

    setState(() {
      _isLoading = true;
    });

    CallResponse response = await network.fetchUserData(
      userId,
      phone: phone,
      email: email,
    );

    setState(() {
      _isLoading = false;
    });
    if (response.status == 1) {
      debugPrint(response.msg.toString());
      //IF USER DATA IS FOUND

      showSnackBar('User account exists', context);
    } else {
      //Since network returns one or zero, 1 for the success of request and 0 for both server error and failure of request
      //Response msg will return null if user was not found and it will return an actual server failure msg if it was a server error
      if (response.msg == 'null') {
        Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => (googleSignUp)
                ? GooglePostSignUp(userData: userData)
                : ServerSignUp(phoneNumber: userId, userData: userData),
          ),
        );
      } else {
        showSnackBar(response.msg, context);
      }
    }
  }
}

我在一个有状态的小部件中调用 function,我定义了一个 function 来帮助调用小吃店,我的应用程序严重依赖小吃店,我的所有文件都有同样的错误。 这是小吃店 function

void showSnackBar(String? value, BuildContext context) {
  ScaffoldMessenger.of(context).hideCurrentSnackBar();
  ScaffoldMessenger.of(context).showSnackBar(
    SnackBar(
      content: Text(
        value!,
        style: p2(
          false,
        ),
      ),
      duration: const Duration(seconds: 2),
      action: SnackBarAction(
        label: 'Close',
        textColor: themeColor,
        onPressed: () {
          ScaffoldMessenger.of(context).hideCurrentSnackBar();
        },
      ),
    ),
  );
}

我可以在我的项目中轻松地从任何地方调用我的自定义小吃店。

我可以通过删除 function 中的 Buildcontext 类型来欺骗 IDE 和 lint,但它不实用,我可以在调用 snackbar 之前检查小部件是否已安装,但我认为它不太实用???

最简单的方法就是放

if (!mounted) return;

在您调用 snackbar 或任何需要上下文的内容之前获取 void 函数。

我知道您在考虑应用程序性能,哦:等等。 flutter 已经为您完成了。),除非您有时间和精力,否则您无需解决它。 请注意,每次都必须传递上下文,因此每次都检查上下文挂载并不是“我认为这不太实用”的情况

像这样的事情我称之为(The warning error) 在可能因嵌套而丢失的上下文中使用async函数时。 你需要小心处理它。

一种方法是检查挂载的小部件 state。基本上,如果不确定小部件是否已挂载,请不要在异步后使用context

为确保使用以下内容:

if (!mounted) return; // check before calling `Navigator`
Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => (googleSignUp)
                ? GooglePostSignUp(userData: userData)
                : ServerSignUp(phoneNumber: userId, userData: userData),
          ),
        );

要使代码简写,只需执行法线即可:!! :) 在同一个文件中分解代码!!

再见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM