如何允许后退按钮在颤振中退出应用程序
How to permit back button to exit app in flutter
我在 youtube 上观看教程并在堆栈溢出中阅读了一些答案后,目前正在使用 WillPopScope 来防止后退按钮,路线是这样的。我有登录屏幕和主屏幕。当我在主屏幕时,当我从 phone 单击后退按钮时我想关闭我的应用程序,我尝试使用 WillPopScope 但是当我单击后退按钮时,它总是将我导航到我的登录屏幕,有没有办法让我的应用程序将单击后退按钮时退出?这是我的代码
这是登录屏幕
class _LoginScreenState extends State<LoginScreen> {
postData() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setInt('username', _username.text);
Navigator.push(context,
new MaterialPageRoute(
builder: (BuildContext context) =>
new BottomTab()));
}
@override
Widget build(BuildContext context) {
return Column(
children:<Widget>[
TextFormField(
controller: _username),
FlatButton(
child: Text("Login"),
onPressed: () {
postData(_username.text);}),];}
}
这是我的标签
class _BottomTab extends State<BottomTab> {
Future<bool> _back() {
return showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
content: Text('exit?'),
actions: <Widget>[
FlatButton(
child: Text('ok'),
onPressed: () {
Navigator.of(context).pop(true);
},
),
FlatButton(
child: Text('no'),
onPressed: () {
Navigator.of(context).pop(false);
},
),
],
);
});
}
int _selectedIndex = 0;
_onTap(int index) {
setState(() => _myindex = index);
}
final List<Widget> pages = [
HomeScreen(),
ProfileScreen(),
];
final PageStorageBucket bucket = PageStorageBucket();
Widget _myNavigation(int selectedIndex) => BottomNavigationBar(
onTap: _onTap,
currentIndex: myindex,
type: BottomNavigationBarType.fixed,
items: const <MyTab>[
MyTab(icon: Icon(Icons.home), title: Text('Home')),
MyTab(icon: Icon(Icons.person), title: Text('Profile')),
],
);
@override
Widget build(BuildContext context) {
return FutureProvider<String>(
create: (context) async {
final prefs = await SharedPreferences.getInstance();
return prefs.getString("username");
},
child: Scaffold(
key: scaffoldKey,
body: WillPopScope(
onWillPop: back,
child: PageStorage(
child: pages[_selectedIndex],
bucket: bucket,
),
),
bottomNavigationBar: _bottomNavigationBar(_selectedIndex),
),
);
}
}
Login
屏幕位于导航器堆栈中,因此当您尝试从 BottomTab
屏幕弹出时,登录屏幕再次出现。而不是:
Navigator.push(context,
new MaterialPageRoute(
builder: (BuildContext context) =>
new BottomTab()));
做这样的事情:
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (BuildContext context) => new BottomTab()),
(Route<dynamic> route) => false
);
Navigator.pushAndRemoveUntil
会将 ButtomTab 推入导航器并弹出堆栈中的所有路由。
当您从登录屏幕转到主屏幕时,请使用 Navigator.of(context).pushReplacement(newRoute)
而不是 Navigator.of(context).push(newRoute)
。它将在导航器堆栈中用主页路由替换登录路由,因此当您按下后退按钮时,主屏幕下方的导航器堆栈中会出现注释,因此应用程序将关闭。
您好,您可以通过以下方式退出您的应用程序:
插入 WillPopScope
小部件
WillPopScope(
onWillPop: () => onWillPop(上下文),
child: //其他小部件在这里)
然后创建一个方法来处理onWillPop
onWillPop(上下文)异步{
SystemChannels.platform.invokeMethod('SystemNavigator.pop');
return假;
}
我在 youtube 上观看教程并在堆栈溢出中阅读了一些答案后,目前正在使用 WillPopScope 来防止后退按钮,路线是这样的。我有登录屏幕和主屏幕。当我在主屏幕时,当我从 phone 单击后退按钮时我想关闭我的应用程序,我尝试使用 WillPopScope 但是当我单击后退按钮时,它总是将我导航到我的登录屏幕,有没有办法让我的应用程序将单击后退按钮时退出?这是我的代码 这是登录屏幕
class _LoginScreenState extends State<LoginScreen> {
postData() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setInt('username', _username.text);
Navigator.push(context,
new MaterialPageRoute(
builder: (BuildContext context) =>
new BottomTab()));
}
@override
Widget build(BuildContext context) {
return Column(
children:<Widget>[
TextFormField(
controller: _username),
FlatButton(
child: Text("Login"),
onPressed: () {
postData(_username.text);}),];}
}
这是我的标签
class _BottomTab extends State<BottomTab> {
Future<bool> _back() {
return showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
content: Text('exit?'),
actions: <Widget>[
FlatButton(
child: Text('ok'),
onPressed: () {
Navigator.of(context).pop(true);
},
),
FlatButton(
child: Text('no'),
onPressed: () {
Navigator.of(context).pop(false);
},
),
],
);
});
}
int _selectedIndex = 0;
_onTap(int index) {
setState(() => _myindex = index);
}
final List<Widget> pages = [
HomeScreen(),
ProfileScreen(),
];
final PageStorageBucket bucket = PageStorageBucket();
Widget _myNavigation(int selectedIndex) => BottomNavigationBar(
onTap: _onTap,
currentIndex: myindex,
type: BottomNavigationBarType.fixed,
items: const <MyTab>[
MyTab(icon: Icon(Icons.home), title: Text('Home')),
MyTab(icon: Icon(Icons.person), title: Text('Profile')),
],
);
@override
Widget build(BuildContext context) {
return FutureProvider<String>(
create: (context) async {
final prefs = await SharedPreferences.getInstance();
return prefs.getString("username");
},
child: Scaffold(
key: scaffoldKey,
body: WillPopScope(
onWillPop: back,
child: PageStorage(
child: pages[_selectedIndex],
bucket: bucket,
),
),
bottomNavigationBar: _bottomNavigationBar(_selectedIndex),
),
);
}
}
Login
屏幕位于导航器堆栈中,因此当您尝试从 BottomTab
屏幕弹出时,登录屏幕再次出现。而不是:
Navigator.push(context,
new MaterialPageRoute(
builder: (BuildContext context) =>
new BottomTab()));
做这样的事情:
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (BuildContext context) => new BottomTab()),
(Route<dynamic> route) => false
);
Navigator.pushAndRemoveUntil
会将 ButtomTab 推入导航器并弹出堆栈中的所有路由。
当您从登录屏幕转到主屏幕时,请使用 Navigator.of(context).pushReplacement(newRoute)
而不是 Navigator.of(context).push(newRoute)
。它将在导航器堆栈中用主页路由替换登录路由,因此当您按下后退按钮时,主屏幕下方的导航器堆栈中会出现注释,因此应用程序将关闭。
您好,您可以通过以下方式退出您的应用程序:
插入
WillPopScope
小部件WillPopScope( onWillPop: () => onWillPop(上下文), child: //其他小部件在这里)
然后创建一个方法来处理onWillPop
onWillPop(上下文)异步{ SystemChannels.platform.invokeMethod('SystemNavigator.pop'); return假; }