dart PopScope返回失败Assert:第5238行位置12:'!_debugLocked':在Flutter 3.16.1中不为真

ogsagwnx  于 5个月前  发布在  Flutter
关注(0)|答案(2)|浏览(91)

场景

我需要有条件地导航到一个屏幕,因此在我的应用程序中使用了Scaffold小部件 Package 的WillPopScope小部件。

验证码:

WillPopScope(
      onWillPop: () async {
        if (hasProfilePicUpdated) {
          Navigator.pushNamedAndRemoveUntil(
            context,
            Routes.dashboard,
            (route) => false,
            arguments: DashboardArgumentModel(
              onboardingState: dashboardArgumentModel.onboardingState,
            ).toMap(),
          );
        } else {
          Navigator.pop(context);
        }
        return false;
      },
      child: Scaffold(

字符串
使用上面的代码,我能够导航到我想要的屏幕。现在,在我将Flutter升级到3.16.1之后,我得到了一个警告,WillPopScope已被弃用,我应该使用PopScope。因此,我更新了我的代码如下:

验证码:

PopScope(
      // canPop: true, - this makes no difference
      onPopInvoked: (val) async {
        if (hasProfilePicUpdated) {
          Navigator.pushNamedAndRemoveUntil(
            context,
            Routes.dashboard,
            (route) => false,
            arguments: DashboardArgumentModel(
              onboardingState: dashboardArgumentModel.onboardingState,
            ).toMap(),
          );
        } else {
          Navigator.pop(context);
        }
      },
      child: Scaffold(

问题

然而,当我点击后退按钮时,使用PopScope的代码给了我以下错误:

[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception:'package:flutter/src/widgets/navigator. dart':Failed assertion:line 5238 pos 12:'!_debugLocked':is not true.

我已经尝试

  • Navigator.pop(context) Package 在WidgetsBinding.instance.addPostFrameCallback((_)
  • Navigator.pop(context)之前添加Future.delayed(),但仍然面临相同的问题。
    请求

我想知道我在代码中做错了什么,这阻止了我使用PopScope实现所需的行为,以及如何纠正错误。

oxf4rvwz

oxf4rvwz1#

基于以下地址给出的答案:https://stackoverflow.com/a/77529346/19413610
事实证明,我需要从函数返回,如果boolean参数到onPoppicked函数返回true。下面是功能代码:

PopScope(
          onPopInvoked: (didPop) async {
            if (didPop) {
              return;
            }
            if (hasProfilePicUpdated) {
              Navigator.pushNamedAndRemoveUntil(
                context,
                Routes.dashboard,
                (route) => false,
                arguments: DashboardArgumentModel(
                  onboardingState: dashboardArgumentModel.onboardingState,
                ).toMap(),
              );
            } else {
              Navigator.pop(context);
            }
          },
          child: Scaffold(

字符串

i5desfxk

i5desfxk2#

您可以使用DataBinding.instance.addPostFrameCallback()方法将对Navigator.pop()的调用延迟到当前帧被呈现之后。

SchedulerBinding.instance.addPostFrameCallback((_) {
    Navigator.pop(context);
  });

字符串

相关问题