新的 PopScope
替换 WillPopScope
时会出现一个问题,因为 PopScope.canPop
的值是在 build 时就确定了的,pop 的时候并不会再次计算,因此,如果赋值给 canPop
的变量在 build
�更新PopScope
并不能拦截到。
如下图,canPop 在退出时总是 true。
处理方法很简单,也很偷懒。把 canPop
设置为 false
,然后 onPopInvoked
中使用 Navigator.of(context).pop()
返回。
return PopScope( canPop: false, onPopInvoked: (bool didPop) { if (didPop) { return; }
if (!Settings.instance.backKey2Parent) { Navigator.of(context).pop(); return; }
String path = this.sftpNotifier.path; if (this.sftpNotifier.isLoading || path == '/' || path.isEmpty) { Navigator.of(context).pop(); return; } else { if (this.sftpNotifier.preLinkpath != null) { path = this.sftpNotifier.preLinkpath!; } else { path = p.dirname(path); } sftpNotifier.load(this.widget.agent, path, savePath: true); setState(() {}); } }, child: ...
|
需要注意的是,必须加上
因为Navigator.of(context).pop()
也会调用 onPopInvoked
。