[英]Flutter returns Main.dart screen instead of closing the Application
我是 flutter 的新手,我遇到了一个错误 - 基本上,我有两个屏幕,一个是我的 main.dart 文件的登录屏幕,第二个是主屏幕。所以我只是尝试实现“双击后退按钮退出”在我的主屏幕上。为此,我使用了“WillPopScope”,但是当我单击后退按钮时,将我扔到登录屏幕而不是关闭应用程序。
这是我的代码 -
主屏幕 -
return Scaffold(
bottomNavigationBar: bottomnav(),
body: WillPopScope(
onWillPop: () async {
final difference = DateTime.now().difference(timeBackPressed);
final isExitWarning = difference >= Duration(seconds: 2);
timeBackPressed = DateTime.now();
if (isExitWarning) {
final message = "Press Back Again To Exit";
Fluttertoast.showToast(
msg: message,
fontSize: 18,
backgroundColor: Colors.white,
textColor: Colors.black.withOpacity(0.95));
return false;
} else {
Fluttertoast.cancel();
return true;
}
},
child: SingleChildScrollView(
reverse: false,
scrollDirection: Axis.vertical,
child: Container(
width: double.infinity,
//height: MediaQuery.of(context).size.height,
child: Column(children: <Widget>[
Padding(
padding: EdgeInsets.only(
top: 30, bottom: 12, left: 20, right: 0),
child: Align(
alignment: Alignment.bottomLeft,
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text("Hello! Sudeep",
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w800,
color: Color(0xfffef9e7),
fontFamily: 'Lato')),
Text("Arya Nagar,Bhind",
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w600,
fontFamily: 'Lato',
color: Color(0xff808b96)))
]),
),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Container(
width: MediaQuery.of(context).size.width / 1.45,
height: 50,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.0),
color: Color(0xff17202a),
),
child: TextField(
style: GoogleFonts.inter(
color: Color(0xff808b96),
fontSize: 19,
//fontFamily: 'Lato',
),
cursorColor: Color(0xff808b96),
decoration: InputDecoration(
filled: true,
fillColor: Color(0xff212121),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(11.0),
borderSide: BorderSide(
style: BorderStyle.none, width: 0),
),
hintText: "Search Here",
hintStyle: TextStyle(
fontSize: 18,
color: Color(0xff808b96),
fontWeight: FontWeight.w400),
prefixIcon: Icon(Icons.search,
color: Color(0xff808b96), size: 30)),
),
),
Container(
width: MediaQuery.of(context).size.width / 5.9,
height: 56.0,
padding: EdgeInsets.only(
top: 1.6, bottom: 0, right: 12.0, left: 5.6),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15.0),
color: Color(0xff212121),
),
child: IconButton(
onPressed: () {},
icon: Icon(Icons.qr_code,
color: Color(0xff808b96), size: 39.0))),
]),
SizedBox(height: 30.0),
Container(
width: 364,
height: 200,
child: ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: itemimg.length,
itemBuilder: (context, index) {
return Padding(
padding: EdgeInsets.only(right: 22, left: 6),
child: Card(
clipBehavior: Clip.antiAlias,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(22)),
child: itemimg[index]),
);
}),
),
SizedBox(height: 29),
Visibility(
child: Column(children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(
left: 29, right: 10, bottom: 14),
child: Icon(Icons.thumb_up_alt_outlined,
color: Colors.blue),
),
Text("Top Picks for u",
style: GoogleFonts.inter(
fontSize: 20,
fontWeight: FontWeight.w800,
color: Color(0xff808b96),
)),
]),
Padding(
padding: EdgeInsets.only(left: 20),
child: Container(
height: 200,
child: ListView.separated(
clipBehavior: Clip.antiAlias,
shrinkWrap: true,
scrollDirection: Axis.horizontal,
separatorBuilder: (context, _) =>
SizedBox(width: 10),
itemCount: reslst.length,
itemBuilder: (context, index) {
return Card(
color: Colors.transparent,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(18.0),
),
child: Container(
width: 180.0,
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(18.0),
),
child: Column(
mainAxisAlignment:
MainAxisAlignment.start,
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
menu(),
));
},
child: ClipRRect(
borderRadius:
BorderRadius.circular(
18.0),
child: reslst[index])),
Padding(
padding: EdgeInsets.only(
left: 10, top: 7),
child: Text(txtlst[index],
style: GoogleFonts.inter(
fontSize: 17,
fontWeight:
FontWeight.w600,
color:
Color(0xff263238))),
),
Row(children: [
Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
left: 10,
right: 3.5),
child: Icon(Icons.grade,
size: 15,
color: Colors.green),
),
Text("5.0",
style: GoogleFonts.inter(
fontSize: 14,
fontWeight:
FontWeight.w600,
color:
Color(0xff424242))),
]),
Row(children: [
Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
left: 10,
right: 3.5),
child: Icon(Icons.timer,
size: 15,
color: Colors.orange),
),
Text("45 mins",
style: GoogleFonts.inter(
fontSize: 14,
fontWeight:
FontWeight.w600,
color:
Color(0xff424242))),
]),
])));
}),
),
)
])),
SizedBox(height: 25),
Visibility(
child: Column(children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(
left: 29, right: 10, bottom: 14),
child: Icon(Icons.timer, color: Colors.orange),
),
Text("Less Waiting Time",
style: GoogleFonts.inter(
fontSize: 20,
fontWeight: FontWeight.w800,
color: Color(0xff808b96),
)),
]),
Padding(
padding: EdgeInsets.only(left: 20),
child: Container(
height: 200,
child: ListView.separated(
clipBehavior: Clip.antiAlias,
shrinkWrap: true,
scrollDirection: Axis.horizontal,
separatorBuilder: (context, _) =>
SizedBox(width: 10),
itemCount: reslst.length,
itemBuilder: (context, index) {
return Card(
color: Colors.transparent,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(18.0),
),
child: Container(
width: 180.0,
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(18.0),
),
child: Column(
mainAxisAlignment:
MainAxisAlignment.start,
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
InkWell(
onTap: () {
debugPrint("clicked");
},
child: ClipRRect(
borderRadius:
BorderRadius.circular(
18.0),
child: reslst[index])),
Padding(
padding: EdgeInsets.only(
left: 10, top: 7),
child: Text(txtlst[index],
style: GoogleFonts.inter(
fontSize: 17,
fontWeight:
FontWeight.w600,
color:
Color(0xff263238))),
),
Row(children: [
Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
left: 10,
right: 3.5),
child: Icon(Icons.grade,
size: 15,
color: Colors.green),
),
Text("5.0",
style: GoogleFonts.inter(
fontSize: 14,
fontWeight:
FontWeight.w600,
color:
Color(0xff424242))),
]),
Row(children: [
Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
left: 10,
right: 3.5),
child: Icon(Icons.timer,
size: 15,
color: Colors.orange),
),
Text("45 mins",
style: GoogleFonts.inter(
fontSize: 14,
fontWeight:
FontWeight.w600,
color:
Color(0xff424242))),
]),
])));
}),
),
)
])),
SizedBox(height: 25),
Visibility(
child: Column(children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(
left: 29, right: 10, bottom: 14),
child:
Icon(Icons.grade_outlined, color: Colors.green),
),
Text("Top Rated",
style: GoogleFonts.inter(
fontSize: 20,
fontWeight: FontWeight.w800,
color: Color(0xff808b96),
)),
]),
Padding(
padding: EdgeInsets.only(left: 20),
child: Container(
height: 200,
child: ListView.separated(
clipBehavior: Clip.antiAlias,
shrinkWrap: true,
scrollDirection: Axis.horizontal,
separatorBuilder: (context, _) =>
SizedBox(width: 10),
itemCount: reslst.length,
itemBuilder: (context, index) {
return Card(
color: Colors.transparent,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(18.0),
),
child: Container(
width: 180.0,
decoration: BoxDecoration(
borderRadius:
BorderRadius.circular(18.0),
),
child: Column(
mainAxisAlignment:
MainAxisAlignment.start,
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
InkWell(
onTap: () {
debugPrint("clicked");
},
child: ClipRRect(
borderRadius:
BorderRadius.circular(
18.0),
child: reslst[index])),
Padding(
padding: EdgeInsets.only(
left: 10, top: 7),
child: Text(txtlst[index],
style: GoogleFonts.inter(
fontSize: 17,
fontWeight:
FontWeight.w600,
color:
Color(0xff263238))),
),
Row(children: [
Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
left: 10,
right: 3.5),
child: Icon(Icons.grade,
size: 15,
color: Colors.green),
),
Text("5.0",
style: GoogleFonts.inter(
fontSize: 14,
fontWeight:
FontWeight.w600,
color:
Color(0xff424242))),
]),
Row(children: [
Padding(
padding: EdgeInsets.only(
top: 5,
bottom: 5,
left: 10,
right: 3.5),
child: Icon(Icons.timer,
size: 15,
color: Colors.orange),
),
Text("45 mins",
style: GoogleFonts.inter(
fontSize: 14,
fontWeight:
FontWeight.w600,
color:
Color(0xff424242))),
]),
])));
}),
),
)
])), ));
用
Navigator.pushReplacement(context, MaterialPageRoute(builder:
(context)=>HomeScreen()));
从LoginScreen路由到HomeScreen,路由后配置上一个路由。
据我了解,您有登录屏幕和主屏幕,您希望在用户在主屏幕上时关闭应用程序,而不是将它们返回到登录屏幕。
您可以通过双击时调用下面的函数来解决它。
SystemNavigator.pop();
AlertDialog 的示例:
onWillPop: () {
return showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Watch out!', style: TextStyle(color: Colors.black)),
content: Text('Do you really want to leave?', style: TextStyle(color: Colors.black)),
actions: <Widget>[
TextButton(
child: Text('Yes!'),
onPressed: () {SystemNavigator.pop();}
),
TextButton(
child: Text('No!'),
onPressed: () {Navigator.of(context).pop();}
)
]
);
}
);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.