Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 使用设备'返回上一个片段;s后退按钮_Flutter_Dart_Flutter Layout_Flutter Test - Fatal编程技术网

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);