扑-Android后退按钮不会调用WillPopScope的onWillPop

时间:2020-02-18 17:54:55

标签: flutter dart

我想退出我的申请。我已经实现了WillPopScope,但是好像根本没有调用onWillPop函数。我尝试了很多想法,例如将WillPopScope与Scaffold交换,更改了函数的返回值,但看起来好像并没有按预期工作。

我的代码:

Future<bool> _willPopCallback() async {
  exit(0);
  // await showDialog or Show add banners or whatever
  // then
  return true; // return true if the route to be popped
}


return Scaffold(
    appBar: MyAppBar(
      leading: DrawerAction(),
      title: Text(AppLocalizations.of(context).textCapitalized('home_page')),
      onSearch: (searchTerms) => this.search(searchTerms, context),
    ),
    body: new WillPopScope(
      onWillPop: _willPopCallback, // Empty Function.
      child: //my screen widgets

我不确定这是否是错误,应该报告一下还是我做错了。很高兴根据要求提供更多代码。

我尝试过:

exit(0);
Navigator.of(context).pop();
SystemChannels.platform.invokeMethod('SystemNavigator.pop');

谢谢!

6 个答案:

答案 0 :(得分:6)

首先不要使用exit(0) 。在Android环境中可能很好,但是如果Apple通过编程方式自行关闭,则Apple不允许在应用商店中使用该应用。

onWillPop的{​​{3}}中,明确提到函数应解析为布尔值。

Future<bool> _willPopCallback() async {
   // await showDialog or Show add banners or whatever
   // then
   return Future.value(true);
}

仅当您的当前页面是导航堆栈的根目录时,此选项才有效。

答案 1 :(得分:5)

我设法解决了我的问题,我认为这是一个非常特殊的案例,但它可能仍然对某人有所帮助。

TL; DR:确保小部件中没有多个支架

我在菜单导航器中使用了IndexedStack,显然是用脚手架包裹的。堆栈的页面也具有脚手架,并且使用此组合WillPopScope在导航器页面中的堆栈页面中均不起作用。我通过删除堆栈页面中的所有脚手架并在控制器中仅放置一个脚手架来解决。这样,我设法正确使用了WillPopScope

答案 2 :(得分:2)

修改代码返回WillPopScope,把Scaffold当成孩子。

return new WillPopScope(
    onWillPop: _willPopCallback,
    child: new Scaffold(
     //then the rest of your code...

答案 3 :(得分:1)

我知道我来晚了,但问题仍然存在。 也许我找到了正确的解决方案。 确保您将 MaterialApp 传递给 runApp 方法,如下所示:

runApp(MaterialApp(home: MyFirstPage()));

这适用于我所有应用程序的小部件。如果您不想使用它,只需将您的小部件包装在 MaterialApp 中,但不要忘记在每个 MaterialApp 实例中都会创建一个新的导航器,所以对我来说,我刚刚创建了一个如上所述的导航器,在我的所有页面中,我只使用了脚手架,一切都是好的。

答案 4 :(得分:0)

我也遇到了同样的问题,但经过大量搜索,我发现这个错误与我的父容器有关。

return WillPopScope(
      onWillPop: () => _onWillPop(),
      child: Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.transparent,
          ...
          ],
        ),

答案 5 :(得分:0)

另一个可能的原因:我对 _onWillPop() 的实现抛出了一个异常并且 _onWillPop() 中的代码被忽略了。异常没有出现在日志中。

我通过在 _onWillPop() 中使用 TRY/CATCH 并处理所有代码路径解决了这个问题。