我创建了两个页面,一个是登录页面,另一个是主页,但是我想从主页关闭应用程序,我正在使用Willpopscope
,但是它对我不起作用,我已经尝试了所有方法,但是onwillpop
方法是不打来,请帮我谢谢。
class main_page extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(primarySwatch: Colors.amber),
home: my_page(),
);
}
}
class my_page extends StatefulWidget {
@override
_my_pageState createState() => _my_pageState();
}
class _my_pageState extends State<my_page> {
@override
void initState() {
check_login();
super.initState();
}
Future check_login() async {
SharedPreferences preferences = await SharedPreferences.getInstance();
if (preferences.getBool("islogin") == false)
setState(() {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => MyApp(),
));
});
}
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async=>false,
child: Scaffold(
appBar: new AppBar(
title: Text(
"Home",
style: new TextStyle(color: Colors.white),
),
actions: <Widget>[
FlatButton(
onPressed: () async {
SharedPreferences sharedPreferences =
await SharedPreferences.getInstance();
setState(() {
sharedPreferences.setBool("islogin", false);
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => main_page(),
));
});
},
child: Text(
"Logout",
style: TextStyle(color: Colors.white, fontSize: 16.0),
))
],
),
),
);
}
}
我也正在使用Shredprefrences
,但我认为我想要从main_page关闭应用程序没关系,谢谢您。
答案 0 :(得分:1)
这就是您应该使用的方式
Future<bool> _willPopCallback() async {
// await Show dialog of exit or what you want
// then
return true; //
}
//then use in the build like
WillPopScope(child: new Scaffold(), onWillPop: _willPopCallback)
答案 1 :(得分:1)
只需查看此答案,然后让我知道它是否有效:
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter/services.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(primarySwatch: Colors.amber),
home: SecondPage(),
);
}
}
class LoginPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
child: Center(
child: RaisedButton(
child: Text('Move to second page after Login'),
onPressed: () async {
SharedPreferences preferences =
await SharedPreferences.getInstance();
preferences.setBool("islogin", true);
// this will remove the login page after routing to the second page and then the stack will have only one page that is second page.
// so later you can use the willpopscape
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (context) => SecondPage()),
ModalRoute.withName("/Home"));
},
)),
),
);
}
}
class SecondPage extends StatefulWidget {
@override
_SecondPageState createState() => _SecondPageState();
}
class _SecondPageState extends State<SecondPage> {
@override
void initState() {
check_login();
super.initState();
}
Future check_login() async {
SharedPreferences preferences = await SharedPreferences.getInstance();
if (preferences.getBool("islogin") == null)
//This above if statement will check if the parameter islogin is null then redirect to the login screeen
// else if the value is not null then i will not enter the if statement
setState(() {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) => LoginPage(),
));
});
}
Future<bool> _onWillPop() async {
// This dialog will exit your app on saying yes
return (await showDialog(
context: context,
builder: (context) => new AlertDialog(
title: new Text('Are you sure?'),
content: new Text('Do you want to exit an App'),
actions: <Widget>[
new FlatButton(
onPressed: () => Navigator.of(context).pop(false),
child: new Text('No'),
),
new FlatButton(
onPressed: () => Navigator.of(context).pop(true),
child: new Text('Yes'),
),
],
),
)) ??
false;
}
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: _onWillPop,
child: Scaffold(
appBar: new AppBar(
title: Text(
"Home",
style: new TextStyle(color: Colors.white),
),
actions: <Widget>[
FlatButton(
onPressed: () async {
SystemNavigator.pop();
},
child: Text(
"Logout",
style: TextStyle(color: Colors.white, fontSize: 16.0),
))
],
),
),
);
}
}
答案 2 :(得分:0)
这里是答案example_page
代码
class exmp extends StatefulWidget {
@override
_exmpState createState() => _exmpState();
}
class _exmpState extends State<exmp> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("example"),
),
body: Column(
children: <Widget>[
Center(
child: RaisedButton(onPressed: () {
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(
builder: (context) => my_example(),
),
(route) => false);
}),
)
],
),
);
}
}
这是我的第二页my_example
class my_example extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(primarySwatch: Colors.amber),
home: my_examp(),
);
}
}
class my_examp extends StatefulWidget {
@override
_my_exampState createState() => _my_exampState();
}
class _my_exampState extends State<my_examp> {
Future<bool> onbackpress() async{
return true;
}
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: onbackpress,
child: Scaffold(
appBar: AppBar(
title: Text("my_eaxmple"),
),
),
);
}
}
问题是我要从主页上推送另一页,但是我忘记删除第一页,因为我在导航到另一页之前曾使用 Navigator.of(context).pushAndRemoveUntil( MaterialPageRoute(builder: (context) => my_example()(route) => false);
来删除主页