android - 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
解决方案
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,
);
它将推送所需的页面并从堆栈中删除所有其他内容。
推荐阅读
- c# - 如何在类图VS2017中获得自动关系?
- python - Python 3.7 使用 BeautifulSoup 抓取页面的问题与堆栈交换上的可用代码
- laravel - Laravel Vue Router 返回 404 页面
- regex - AWK:处理多个分隔符标准的优雅方式
- mysql - NodeJS MySQL Client 不支持认证协议
- google-bigquery - 从 AdWords 到 BigQuery 的 Google 转移服务
- java - 使用隐式参数字符串转换创建方法
- android - 取消选中 ExpandableListView 组中的所有 CheckedTextView
- android - onStart() 或 onPause() 返回后,Activity 是否处于暂停状态?
- c# - 文件控件未在编辑页面中初始化 - 剃须刀页面