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

Rub*_*lak 7 android button back dart flutter

这是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());
  }
}
Run Code Online (Sandbox Code Playgroud)

这是主屏幕.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')),
            ]
          )
    ));
  }
}
Run Code Online (Sandbox Code Playgroud)

这是导航器小部件

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);
            }
          },
        );
      }
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

我使用 Navigator.pushNamed 函数在这些屏幕之间导航

onPressed: () => Navigator.pushNamed(context,"/listhub"),

但是当我单击 android 后退按钮时,它会关闭应用程序,而不是导航到上一页...我在每个页面中尝试了 WillpopScope 但它不起作用。

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

cas*_*ers 1

Navigator我相信这种情况正在发生,因为当操作系统级别的后退手势和您的功能从 MaterialApp 的导航器中弹出时,您正在推动自己的_onBackPressed操作。由于后者没有任何路由推送,它的行为符合预期并退出应用程序。

这个Github 问题通过几个不同的解决方案详细介绍了该问题。您可以在 main 中创建一个全局键,并使用navigatorKey参数将其传递给materialApp,并DashboardNavigator使用其键参数。这样,无论您在何处推送或弹出,MaterialApp 和您的 DashboardNavigator 都将使用相同的导航器。