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