Migrate WillPopScope to PopScope

新的 PopScope 替换 WillPopScope 时会出现一个问题,因为 PopScope.canPop 的值是在 build 时就确定了的,pop 的时候并不会再次计算,因此,如果赋值给 canPop 的变量在 build �更新PopScope 并不能拦截到。

如下图,canPop 在退出时总是 true。

diff

处理方法很简单,也很偷懒。把 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: ...

需要注意的是,必须加上

if (didPop) {
return
}

因为Navigator.of(context).pop()也会调用 onPopInvoked