首页 > 解决方案 > Flutter WillPopScope 对我来说正常工作,但是当我导航或推回同一页面时它不起作用

问题描述

我的问题是我有一个主页然后登录页面然后是主页,如果我在主页中按注销它应该将我导航回包含 willpopscope 的主页,我想要做的是阻止用户从按下主页中的后退按钮以使应用程序在没有用户登录的情况下不会返回主页,问题是当我 Navigator.push 主页时 willpopscope 不起作用,所以每当我按下后退按钮时它让我回到主页。

我尝试改变 WillPopScope 的位置,如果我用它包裹整个小部件,它永远不会对我有用

重现代码

//Main page:
class MainActivity extends StatefulWidget {
  final bool isWelcome;
  MainActivity(this.isWelcome);
  @override
  State<StatefulWidget> createState() {
    return OperateMainActivity(isWelcome);
  }
}

class OperateMainActivity extends State<MainActivity> {
  bool isWelcome = false;
  OperateMainActivity(this.isWelcome);
  @override
  Widget build(BuildContext context) {
    //print(isWelcome);
    return MaterialApp(
        home: MyHome(
      isWelcome: isWelcome,
    ));
  }
}

class myHome extends StatelessWidget
return Scaffold(
      body: Center(
          child: WillPopScope(
            onWillPop: () async => false,
        child: Container(....)


// Home page

Navigator.push(context,MaterialPageRoute(builder: (context) => MainActivity(false)));

//When pushing to main activity WillPopScope does not work

标签: androidflutterdart

解决方案


WillPopScope推时不会被调用。这是合乎逻辑的行为,因为当您推送另一个视图时,它会超出堆栈中的当前视图。因此,当前视图永远不会弹出。

如果您知道您MainActivity在堆栈中的当前页面下方,则可以更改:

Navigator.push(context,MaterialPageRoute(builder: (context) => MainActivity(false)));

至:

Navigator.pop(context); // This will make a call to onWillPop.

更新:

对于您想要实现的目标,您可以使用pushAndRemoveUntil

Navigator.of(context).pushAndRemoveUntil(
  MaterialPageRoute(
    builder: (context) {
      return MainActivity();
    },
  ),
  (Route<dynamic> route) => false,
);

它将推送所需的页面并从堆栈中删除所有其他内容。


推荐阅读