Flutter 颤振-android后退按钮不调用WillPopScope的onWillPop

Flutter 颤振-android后退按钮不调用WillPopScope的onWillPop,flutter,dart,Flutter,Dart,我想退出我的申请。我已经实现了一个WillPopScope,但是看起来根本没有调用onWillPop函数。我尝试了很多想法,比如用Scaffold交换WillPopScope,改变函数的返回值,但是看起来它并没有像预期的那样工作 我的代码: 提前谢谢 首先,永远不要使用退出(0)。在安卓环境下可能没问题,但如果苹果以编程方式关闭自己的应用程序,它将不允许应用程序商店上的应用程序 在这里的onWillPop中,它清楚地提到函数应该解析为布尔值 Future<bool> _willPop

我想退出我的申请。我已经实现了一个WillPopScope,但是看起来根本没有调用onWillPop函数。我尝试了很多想法,比如用Scaffold交换WillPopScope,改变函数的返回值,但是看起来它并没有像预期的那样工作

我的代码:


提前谢谢

首先,永远不要使用
退出(0)
。在安卓环境下可能没问题,但如果苹果以编程方式关闭自己的应用程序,它将不允许应用程序商店上的应用程序

在这里的
onWillPop
中,它清楚地提到函数应该解析为布尔值

Future<bool> _willPopCallback() async {
   // await showDialog or Show add banners or whatever
   // then
   return Future.value(true);
}
Future\u willPopCallback()异步{
//等待showDialog或Show添加横幅或其他内容
//然后
返回未来值(true);
}

只有当您的当前页面是导航堆栈的根时,这才有效。

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

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


我在菜单导航器中使用了
IndexedStack
,显然是用脚手架包装的。堆栈的页面也有Scaffold,通过这种组合,
WillPopScope
在导航器页面和堆栈页面中都不起作用。我通过移除堆栈页面中的所有脚手架并在控制器中只有一个来解决这个问题。通过这种方式,我成功地正确地使用了Willposcope。

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

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

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

修改代码以返回Willposcope,并将scaffold作为一个孩子

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

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

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

我已经更新了我的答案,退出(0)是我最后一次绝望地尝试看到它的工作,但我已经尝试了我能在网上找到的一切。现在我将尝试使用
Future.value(false)更改false
但当我按下时,该函数似乎根本没有被调用back@Gicminos你试过用
WillPopScope
widget包裹你的脚手架吗是的!将使用
Future.value(false)重试
我几乎可以肯定,为了允许页面“弹出”,您需要返回
Future.value(true)
,而不是false。我将使用
Future.value(true)
重试,但我重复一遍,WillPopScope不会调用函数_willPopCallback()!在小部件结束之前,是否有任何选项可以获取回调,我们也使用多个
Scaffold
s您需要删除多个
Scaffold
s如果它们是嵌套的,那么您的willPopCallback已经在小部件结束之前,您是决定是否通过返回布尔值的人在我的案例中已经完成了
return new WillPopScope(
    onWillPop: _willPopCallback,
    child: new Scaffold(
     //then the rest of your code...
return WillPopScope(
      onWillPop: () => _onWillPop(),
      child: Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.transparent,
          ...
          ],
        ),