Flutter 使用设备'返回上一个片段;s后退按钮
我在尝试实现此功能时遇到问题。我已经看到很多教程建议使用Flutter 使用设备'返回上一个片段;s后退按钮,flutter,dart,flutter-layout,flutter-test,Flutter,Dart,Flutter Layout,Flutter Test,我在尝试实现此功能时遇到问题。我已经看到很多教程建议使用WillPopScope,但我认为这不是处理片段的合适方法 我只有一个页面是主屏幕,它包含一个底部导航,包含5个片段 基本上,我想要的是,如果用户在第一个片段中,则该应用程序将退出。否则,它将转到上一个片段 这是我的主屏幕: class HomeScreen extends StatefulWidget { final List<String> fragmentItems = [ "feed", "searc
WillPopScope
,但我认为这不是处理片段的合适方法
我只有一个页面是主屏幕
,它包含一个底部导航
,包含5个片段
基本上,我想要的是,如果用户在第一个片段中,则该应用程序将退出。否则,它将转到上一个片段
这是我的主屏幕:
class HomeScreen extends StatefulWidget {
final List<String> fragmentItems = [
"feed",
"search",
"upload",
"stars",
"profile"
];
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
bool isScrolled = false;
static bool isStoriesShown = false;
static bool isHomeSelected = true;
static bool isUploadSelected = false;
static bool isSearchSelected = false;
static bool isStarsSelected = false;
static bool isProfileSelected = false;
BottomNavWidget navWidget;
int fragmentIndex;
int _currentIndex = 0;
final List<int> _backstack = [0];
@override
void initState() {
super.initState();
fragmentIndex = 0;
_getFragmentIndex(0);
isHomeSelected = true;
isSearchSelected = false;
isUploadSelected = false;
isStarsSelected = false;
isProfileSelected = false;
}
_getFragmentIndex(int pos) {
switch (pos) {
case 0:
return FeedFragment();
case 1:
return SearchFragment();
case 2:
return UploadFragment();
case 3:
return NotificationFragment();
case 4:
return ProfileFragment();
default:
return FeedFragment();
}
}
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () {
return _onWillPop(context);
},
child: MaterialApp(
home: Scaffold(
bottomNavigationBar: CurvedNavigationBar(
height: 50,
animationDuration: Duration(milliseconds: 500),
animationCurve: Curves.easeInOut,
backgroundColor: Color(colorSecondary),
color: Color(colorBackground),
items: <Widget>[
isHomeSelected
? Container(
child: SvgPicture.asset(
"assets/icons/home_icon_solid.svg",
color: Color(colorPrimary),
fit: BoxFit.scaleDown,
height: 25,
width: 25,
))
: Container(
padding: EdgeInsets.all(25),
child: SvgPicture.asset(
"assets/icons/home_icon_stroke.svg",
color: Color(colorText),
fit: BoxFit.fitHeight,
)),
isSearchSelected
? Container(
child: SvgPicture.asset(
"assets/icons/search_icon_solid.svg",
color: Color(colorPrimary),
fit: BoxFit.scaleDown,
height: 25,
width: 25,
))
: Container(
padding: EdgeInsets.all(25),
child: SvgPicture.asset(
"assets/icons/search_icon_stroke.svg",
color: Color(colorText),
fit: BoxFit.fitHeight,
)),
isUploadSelected
? Container(
child: SvgPicture.asset(
"assets/icons/post_icon_solid.svg",
color: Color(colorPrimary),
fit: BoxFit.scaleDown,
height: 25,
width: 25,
))
: Container(
padding: EdgeInsets.all(25),
child: SvgPicture.asset(
"assets/icons/post_icon_stroke.svg",
color: Color(colorText),
fit: BoxFit.fitHeight,
)),
isStarsSelected
? Container(
child: SvgPicture.asset(
"assets/icons/star_icon_solid.svg",
color: Color(colorPrimary),
fit: BoxFit.scaleDown,
height: 25,
width: 25,
))
: Container(
padding: EdgeInsets.all(25),
child: SvgPicture.asset(
"assets/icons/star_icon_stroke.svg",
color: Color(colorText),
fit: BoxFit.fitHeight,
)),
isProfileSelected
? Container(
child: SvgPicture.asset(
"assets/icons/profile_icon_solid.svg",
color: Color(colorPrimary),
fit: BoxFit.scaleDown,
height: 25,
width: 25,
))
: Container(
padding: EdgeInsets.all(25),
child: SvgPicture.asset(
"assets/icons/profile_icon_stroke.svg",
color: Color(colorText),
fit: BoxFit.fitHeight,
))
],
onTap: (index) {
updateFragment(index);
},
),
resizeToAvoidBottomPadding: false,
appBar: AppBar(
elevation: 2,
backgroundColor: Color(colorBackground),
centerTitle: false,
title: Container(
width: MediaQuery.of(context).size.width,
alignment: Alignment.centerLeft,
padding: EdgeInsets.only(top: 18, bottom: 18),
child: Image.asset(
'assets/app/name.png',
fit: BoxFit.cover,
)),
leading: Container(
padding: EdgeInsets.only(top: 12, left: 12, bottom: 12),
child: Image.asset(
"assets/app/app_icon.png",
fit: BoxFit.contain,
)),
actions: <Widget>[
Container(
padding: EdgeInsets.all(10),
width: 50,
height: 50,
child: GestureDetector(
onTap: () {
Utils().logoutDialog(context);
},
child: SvgPicture.asset("assets/icons/logout.svg",
color: Color(colorPrimary)),
)),
],
),
body: _getFragmentIndex(fragmentIndex),
)));
}
updateFragment(int i) {
_backstack.add(i);
switch (i) {
case 0:
{
setState(() {
isHomeSelected = !isHomeSelected;
isProfileSelected = false;
isSearchSelected = false;
isStarsSelected = false;
isUploadSelected = false;
fragmentIndex = i;
});
break;
}
case 1:
{
setState(() {
isSearchSelected = !isSearchSelected;
isHomeSelected = false;
isProfileSelected = false;
isStarsSelected = false;
isUploadSelected = false;
fragmentIndex = i;
});
break;
}
case 2:
{
setState(() {
isUploadSelected = !isUploadSelected;
isHomeSelected = false;
isSearchSelected = false;
isStarsSelected = false;
isProfileSelected = false;
fragmentIndex = i;
});
break;
}
case 3:
{
setState(() {
isStarsSelected = !isStarsSelected;
isHomeSelected = false;
isSearchSelected = false;
isProfileSelected = false;
isUploadSelected = false;
fragmentIndex = i;
});
break;
}
case 4:
{
setState(() {
isProfileSelected = !isProfileSelected;
isHomeSelected = false;
isSearchSelected = false;
isStarsSelected = false;
isUploadSelected = false;
fragmentIndex = i;
});
break;
}
default:
return Text("Error");
}
}
类主屏幕扩展StatefulWidget{
最终列表碎片项目=[
“饲料”,
“搜索”,
“上传”,
“明星”,
“个人资料”
];
@凌驾
_HomeScreenState createState()=>\u HomeScreenState();
}
类_homescrenstate扩展状态{
bool-isscrowled=false;
静态布尔值isStoriesShown=假;
静态布尔值isHomeSelected=true;
静态bool isUploadSelected=false;
静态布尔isSearchSelected=false;
静态布尔值isStarsSelected=false;
静态bool isProfileSelected=false;
BottomNavWidget-navWidget;
整数碎片索引;
int _currentIndex=0;
最终列表_backstack=[0];
@凌驾
void initState(){
super.initState();
碎片指数=0;
_getFragmentIndex(0);
isHomeSelected=true;
isSearchSelected=false;
isUploadSelected=false;
isStarsSelected=假;
isProfileSelected=false;
}
_getFragmentIndex(int pos){
开关(pos){
案例0:
返回FeedFragment();
案例1:
返回SearchFragment();
案例2:
返回UploadFragment();
案例3:
返回NotificationFragment();
案例4:
返回ProfileFragment();
违约:
返回FeedFragment();
}
}
@凌驾
小部件构建(构建上下文){
返回式示波器(
onWillPop:(){
返回_onWillPop(上下文);
},
孩子:MaterialApp(
家:脚手架(
底部导航栏:曲线导航栏(
身高:50,
animationDuration:持续时间(毫秒:500),
动画曲线:Curves.easeInOut,
背景颜色:颜色(colorSecondary),
颜色:颜色(颜色背景),
项目:[
我被选中了
?容器(
子项:SvgPicture.asset(
“assets/icons/home\u icon\u solid.svg”,
颜色:颜色(colorPrimary),
适合度:BoxFit.scaleDown,
身高:25,
宽度:25,
))
:容器(
填充:边缘设置。全部(25),
子项:SvgPicture.asset(
“assets/icons/home\u icon\u stroke.svg”,
颜色:颜色(colorText),
适合度:BoxFit.fit高度,
)),
我当选了
?容器(
子项:SvgPicture.asset(
“资产/图标/搜索\u图标\u solid.svg”,
颜色:颜色(colorPrimary),
适合度:BoxFit.scaleDown,
身高:25,
宽度:25,
))
:容器(
填充:边缘设置。全部(25),
子项:SvgPicture.asset(
“assets/icons/search_icon_stroke.svg”,
颜色:颜色(colorText),
适合度:BoxFit.fit高度,
)),
已选择isUploadSelected
?容器(
子项:SvgPicture.asset(
“assets/icons/post_icon_solid.svg”,
颜色:颜色(colorPrimary),
适合度:BoxFit.scaleDown,
身高:25,
宽度:25,
))
:容器(
填充:边缘设置。全部(25),
子项:SvgPicture.asset(
“assets/icons/post_icon_stroke.svg”,
颜色:颜色(colorText),
适合度:BoxFit.fit高度,
)),
已选定
?容器(
子项:SvgPicture.asset(
“assets/icons/star\u icon\u solid.svg”,
颜色:颜色(colorPrimary),
适合度:BoxFit.scaleDown,
身高:25,
宽度:25,
))
:容器(
填充:边缘设置。全部(25),
子项:SvgPicture.asset(
“assets/icons/star\u icon\u stroke.svg”,
颜色:颜色(colorText),
适合度:BoxFit.fit高度,
)),
isProfileSelected
?容器(
子项:SvgPicture.asset(
“assets/icons/profile\u icon\u solid.svg”,
颜色:颜色(colorPrimary),
适合度:BoxFit.scaleDown,
身高:25,
宽度:25,
))
:容器(
填充:边缘设置。全部(25),
子项:SvgPicture.asset(
“assets/icons/profile\u icon\u stroke.svg”,
颜色:颜色(colorText),
适合度:BoxFit.fit高度,
))
],
onTap:(索引){
更新标签(索引);
},
),
resizeToAvoidBottomPadding:false,
appBar:appBar(
标高:2,
背景颜色:颜色(colorBackground),
标题:错误,
Navigator.pop(context);