gpt4 book ai didi

Android 应用程序在按下后退按钮时退出,而不是导航到上一个屏幕 - Flutter

转载 作者:行者123 更新时间:2023-12-04 23:42:35 26 4
gpt4 key购买 nike

这是 main.dart

void main() {
runApp(MyApp());
}

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
]);

return MaterialApp(
title: 'List',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.green,
),
home: HomeScreen());
}
}

这是 homescreen.dart
class HomeScreen extends StatefulWidget {
HomeScreen({Key key}) : super(key: key);

@override
_HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {

int _currentindex = 0;
final List<Widget> screen = [
DashboardNavigator(),
RegisterPage(),
];

Future<bool> _onBackPressed() {
return showDialog(
context: context,
builder: (context) => new AlertDialog(
title: new Text('Are you sure ?'),
content: new Text('Do you want to exit ?'),
actionsPadding: EdgeInsets.only(right:10.0,bottom:10.0),
actions: <Widget>[
new GestureDetector(
onTap: () => Navigator.of(context).pop(false),
child: Text("No",
style:TextStyle(
color:Colors.red
)),
),
SizedBox(height: 16),
new GestureDetector(
onTap: () => Navigator.of(context).pop(true),
child: Text("Yes",
style:TextStyle(
color:Colors.green
)),
),
],
),
) ??
false;
}

@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop:_onBackPressed,
child:Scaffold(
body: SafeArea(
child: IndexedStack(
index:_currentindex,
children: screen,
)
),
bottomNavigationBar: BottomNavigationBar(
currentIndex: _currentindex,
onTap: (int index) {
this.setState(() {
_currentindex = index;
}
);
},
items:[
BottomNavigationBarItem(icon: Icon(Icons.home,color:Colors.green),title:Text('Home')),
BottomNavigationBarItem(icon: Icon(Icons.settings_ethernet,color:Colors.green),title:Text('Console')),
]
)
));
}
}

这是导航器小部件
class DashboardNavigator extends StatefulWidget {
DashboardNavigator({Key key}) : super(key: key);

@override
_DashboardNavigatorState createState() => _DashboardNavigatorState();
}

class _DashboardNavigatorState extends State<DashboardNavigator> {

String url;

@override
Widget build(BuildContext context) {
return Navigator(
onGenerateRoute: (RouteSettings settings) {
return MaterialPageRoute(
settings: settings,
builder: (BuildContext context) {
switch(settings.name) {
case '/':
return DashBoard();
case '/listhub':
return ListHub();
case '/listhub/listfarmer':
return ListFarmer(url);
}
},
);
}
);
}
}

我使用 Navigator.pushNamed 函数在这些屏幕之间导航
onPressed: () => Navigator.pushNamed(context,"/listhub"),
但是当我点击 android 后退按钮时,它会关闭应用程序而不是
导航到上一页...我在每个页面中都尝试了 WillpopScope,但它不起作用。

请建议我使用 android 后退按钮和 appBar 后退按钮导航回上一个屏幕的正确方法。

最佳答案

我相信这正在发生,因为您正在插入自己的Navigator而操作系统级别的后退手势和您的_onBackPressed函数正在从 MaterialApp 的导航器中弹出。由于后者没有推送任何路由,因此它按预期运行并退出应用程序。
This Github 问题通过几个不同的解决方案详细介绍了该问题。您可以在 main 中创建一个全局键并使用 navigatorKey 将其传递给 materialApp论据和 DashboardNavigator使用它的关键论点。这样,MaterialApp 和您的 DashboardNavigator 将在您推送或弹出的任何位置使用相同的导航器。

关于Android 应用程序在按下后退按钮时退出,而不是导航到上一个屏幕 - Flutter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60710887/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com