WillPopScope已被弃用
来源:5-8 Android物理返回兼容处理跳转回调实现

LBruce
3天前
老师好,在我学习到本章节的时候,WillPopScope已被弃用
看注释说用PopScope取代
于是尝试用PopScope
结果发现像视频中那样使用WillPopScope的话,可以通过安卓物理按键返回(虽然要点击两下返回键,我用的虚拟机),也可以通过appBar的BackButton返回(从注册页返回登录页)。但是换成PopScope的话,可以正常通过appBar的BackButton返回(从注册页返回登录页),安卓物理按键无论按多少次都没有任何动作。
是我使用的方式不对?还请老师指教,谢谢老师。
写回答
3回答
-
CrazyCodeBoy
2天前
试试这个方案
return PopScope(
canPop: () {
// 由于 PopScope 需要同步返回,应该直接返回 bool 值
// 这里直接判断是否可以 pop
final canPop = navigatorKey.currentState?.canPop() ?? false;
return canPop; // 返回同步的 bool 值
},
child: Navigator(
key: navigatorKey,
pages: pages,
onPopPage: (route, result) {
if (route.settings is MaterialPage) {
// 登录页未登录返回拦截
if ((route.settings as MaterialPage).child is LoginPage) {
if (!hasLogin) {
showWarnToast("请先登录");
return false;
}
}
}
// 执行返回操作
if (!route.didPop(result)) {
return false;
}
var tempPages = [...pages];
pages.removeLast();
// 通知路由发生变化
HiNavigator.getInstance().notify(pages, tempPages);
return true;
},
),
);00 -
LBruce
提问者
3天前
PopPage的canPop,只接受一个bool值
00 -
CrazyCodeBoy
3天前
参考下这个实现方案呢
return PopScope(
canPop: () async {
// 控制是否可以返回上一页
return !(await navigatorKey.currentState?.maybePop() ?? false);
},
child: Navigator(
key: navigatorKey,
pages: pages,
onPopPage: (route, result) {
if (route.settings is MaterialPage) {
// 登录页未登录返回拦截
if ((route.settings as MaterialPage).child is LoginPage) {
if (!hasLogin) {
showWarnToast("请先登录");
return false;
}
}
}
// 执行返回操作
if (!route.didPop(result)) {
return false;
}
var tempPages = [...pages];
pages.removeLast();
// 通知路由发生变化
HiNavigator.getInstance().notify(pages, tempPages);
return true;
},
),
);032天前
相似问题