Flutter 颤振:按下“后退”按钮应该允许应用程序在底部工作表打开时进入后台,并保持引导工作表在视图中

Flutter 颤振:按下“后退”按钮应该允许应用程序在底部工作表打开时进入后台,并保持引导工作表在视图中,flutter,bottom-sheet,Flutter,Bottom Sheet,我问过类似的问题,根据我得到的反馈,我尝试了一些方法,但无法使其发挥作用,因为最初的问题有点老,已经结束,我正在发布我的新发现 理想情况下,这就是我试图实现的目标:如果颤振底片是打开的,我希望在按下“后退”按钮时将其保持打开,并让应用程序进入后台,即当应用程序被回购时,我可以看到底片 拥有一个带有根导航键的MyApp,它将使用自己的键、底页、选项卡等打开RealApp(默认路线)。如果按下任何选项卡,单击“上一步”按钮将弹出这些视图。如果没有更多的视图要弹出,Flutter的默认行为是弹出我试图

我问过类似的问题,根据我得到的反馈,我尝试了一些方法,但无法使其发挥作用,因为最初的问题有点老,已经结束,我正在发布我的新发现

理想情况下,这就是我试图实现的目标:如果颤振底片是打开的,我希望在按下“后退”按钮时将其保持打开,并让应用程序进入后台,即当应用程序被回购时,我可以看到底片

拥有一个带有根导航键的MyApp,它将使用自己的键、底页、选项卡等打开RealApp(默认路线)。如果按下任何选项卡,单击“上一步”按钮将弹出这些视图。如果没有更多的视图要弹出,Flutter的默认行为是弹出我试图覆盖的底部导航,而是希望应用程序按原样进入后台

我尝试了不同的选项,包括从onWillPop中弹出根键,但在没有更多视图可弹出时没有多大成功

void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        navigatorKey: rootGlobalKey,
        home: RealApp()
    );
  }
}

class RealApp extends StatelessWidget {
  final navigatorKey = GlobalKey<NavigatorState>();

  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();

  final pagesRouteFactories = {
    "/": () => MaterialPageRoute(
      builder: (context) => Center(
        child: Text(
          "HomePage",
          style: Theme.of(context).textTheme.body1,
        ),
      ),
    ),
    "takeOff": () => MaterialPageRoute(
      builder: (context) => Center(
        child: Text(
          "Take Off",
          style: Theme.of(context).textTheme.body1,
        ),
      ),
    ),
    "landing": () => MaterialPageRoute(
      builder: (context) => Center(
        child: Text(
          "Landing",
          style: Theme.of(context).textTheme.body1,
        ),
      ),
    ),
    "settings": () => MaterialPageRoute(
      builder: (context) => Center(
        child: Text(
          "Settings",
          style: Theme.of(context).textTheme.body1,
        ),
      ),
    ),
  };

  final RealBottomSheet bottomSheet = new RealBottomSheet();

  @override
  Widget build(BuildContext context) => MaterialApp(
    home: Scaffold(
      key: _scaffoldKey,
      body: _buildBody(context),
      bottomNavigationBar: _buildBottomNavigationBar(context),
    ),
  );

  Widget _buildBody(context) => WillPopScope(
      onWillPop: () async {
        if(navigatorKey.currentState.canPop()) {
          // Navigator.pop(context);
          navigatorKey.currentState.pop();
          return false;
        }else {
          // Returning true will remove BottomSheet from view, followed by moving the app to background state
          // Need a way where the BottomSheet is kept open while the app can go to background state
          // Navigator.of(context, rootNavigator: true).pop();
          rootGlobalKey.currentState.pop();
          // SystemChannels.platform.invokeMethod('SystemNavigator.pop');
          return false;
        }
      },
      child: MaterialApp(
          navigatorKey: navigatorKey,
          onGenerateRoute: (route) => pagesRouteFactories[route.name]())
  );

  Widget _buildBottomNavigationBar(context) => BottomNavigationBar(
      items: [
        _buildBottomNavigationBarItem("Home", Icons.home),
        _buildBottomNavigationBarItem("Take Off", Icons.flight_takeoff),
        _buildBottomNavigationBarItem("Landing", Icons.flight_land),
        _buildBottomNavigationBarItem("Settings", Icons.settings)
      ],
      onTap: (routeIndex) {
        if (routeIndex == 0) return routeToView(routeIndex);
        if (routeIndex == 1) return routeToView(routeIndex);
        if (routeIndex == 2) return routeToView(routeIndex);
        if (routeIndex == 3) return _showBottomSheet();
      });

  _buildBottomNavigationBarItem(name, icon) => BottomNavigationBarItem(
      icon: Icon(icon), title: Text(name), backgroundColor: Colors.black45);

  void routeToView(routeIndex) {
    navigatorKey.currentState.pushNamed(pagesRouteFactories.keys.toList()[routeIndex]);
  }

  void _showBottomSheet() {
    _scaffoldKey.currentState.showBottomSheet<void>((BuildContext context) {
      return _buildBottomSheet(context);
    });
  }

  Widget _buildBottomSheet(BuildContext context) {
    return bottomSheet;
  }
}
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
导航工作:rootGlobalKey,
主页:RealApp()
);
}
}
类RealApp扩展了无状态小部件{
最终navigatorKey=GlobalKey();
最终GlobalKey _scaffoldKey=GlobalKey();
最终页面路由工厂={
“/”:()=>MaterialPage路线(
生成器:(上下文)=>中心(
子:文本(
“主页”,
样式:Theme.of(context).textTheme.body1,
),
),
),
“起飞”:()=>MaterialPage路线(
生成器:(上下文)=>中心(
子:文本(
“起飞”,
样式:Theme.of(context).textTheme.body1,
),
),
),
“着陆”:()=>MaterialPage路线(
生成器:(上下文)=>中心(
子:文本(
“登陆”,
样式:Theme.of(context).textTheme.body1,
),
),
),
“设置”:()=>MaterialPage路由(
生成器:(上下文)=>中心(
子:文本(
“设置”,
样式:Theme.of(context).textTheme.body1,
),
),
),
};
最终RealBottomSheet bottomSheet=新的RealBottomSheet();
@凌驾
小部件构建(构建上下文)=>MaterialApp(
家:脚手架(
钥匙:_scaffoldKey,
正文:_buildBody(上下文),
bottomNavigationBar:_buildBottomNavigationBar(上下文),
),
);
Widget\u buildBody(context)=>WillPopScope(
onWillPop:()异步{
if(navigatorKey.currentState.canPop()){
//Navigator.pop(上下文);
navigatorKey.currentState.pop();
返回false;
}否则{
//返回true将从视图中删除底部工作表,然后将应用程序移动到后台状态
//需要一种方法,当应用程序可以进入后台状态时,底部表单保持打开状态
//of(context,rootNavigator:true).pop();
rootGlobalKey.currentState.pop();
//SystemChannels.platform.invokeMethod('SystemNavigator.pop');
返回false;
}
},
孩子:MaterialApp(
导航工作:导航工作,
onGenerateRoute:(route)=>PagesRouteFactorys[route.name]())
);
小部件_buildBottomNavigationBar(上下文)=>BottomNavigationBar(
项目:[
_buildBottomNavigationBarItem(“主页”,Icons.Home),
_buildBottomNavigationBarItem(“起飞”,图标。航班起飞),
_buildBottomNavigationBarItem(“着陆”,图标。飞行\着陆),
_buildBottomNavigationBarItem(“设置”,图标。设置)
],
onTap:(路由索引){
如果(routeIndex==0)返回routeToView(routeIndex);
如果(routeIndex==1)返回routeToView(routeIndex);
如果(routeIndex==2)返回routeToView(routeIndex);
如果(routeIndex==3)返回_showBottomSheet();
});
_buildBottomNavigationBarItem(名称、图标)=>BottomNavigationBarItem(
图标:图标(icon),标题:文本(name),背景颜色:Colors.black45);
无效路由视图(路由索引){
navigatorKey.currentState.pushNamed(PagesRouteFactorys.keys.toList()[routeIndex]);
}
void _showBottomSheet(){
_scaffoldKey.currentState.showBottomSheet((构建上下文){
返回buildBottomSheet(上下文);
});
}
小部件_buildBottomSheet(BuildContext上下文){
返回底板;
}
}

您现在遇到的问题是什么?通过弹出根导航器,应用程序不会进入后台,而是留下一个白色屏幕,上面没有任何内容:(和SystemChannels.platform.invokeMethod('SystemNavigator.pop'))会像预期的那样将应用程序发送到后台,当应用程序位于后台时,我甚至可以看到底部工作表,但一旦返回,底部工作表就不再存在了