场景
我需要有条件地导航到一个屏幕,因此在我的应用程序中使用了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实现所需的行为,以及如何纠正错误。
2条答案
按热度按时间oxf4rvwz1#
基于以下地址给出的答案:https://stackoverflow.com/a/77529346/19413610
事实证明,我需要从函数返回,如果boolean参数到onPoppicked函数返回true。下面是功能代码:
字符串
i5desfxk2#
您可以使用DataBinding.instance.addPostFrameCallback()方法将对Navigator.pop()的调用延迟到当前帧被呈现之后。
字符串