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;
    },
  ),
);
0
0

LBruce

提问者

3天前

https://img1.sycdn.imooc.com/szimg/37274b6709b695f614190216.jpg


https://img1.sycdn.imooc.com/szimg/385ad16709b695f613980652.jpg


PopPage的canPop,只接受一个bool值


0
0

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;
    },
  ),
);
0
3
CrazyCodeBoy
回复
LBruce
好的,我看看。
2天前
共3条回复

Flutter高级进阶实战-仿哔哩哔哩-掌握Flutter高阶技能

一次性掌握Flutter高阶技能+商业级复杂项目架构设计与开发方案

1722 学习 · 870 问题

查看课程