Android 后退按钮不适用于 Flutter 选项卡内的导航器

标签 android flutter tabs navigation

我需要在每个选项卡内有一个导航器,因此当我推送一个新的 Widget 时,选项卡栏会一直显示在屏幕上。代码运行良好,但 android 后退按钮正在关闭应用程序而不是运行 Navigator.pop()

import 'package:flutter/material.dart';

void main() {
  runApp(const TabBarDemo());
}

class TabBarDemo extends StatelessWidget {
  const TabBarDemo({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DefaultTabController(
        length: 1,
        child: Scaffold(
          bottomNavigationBar: const BottomAppBar(
            color: Colors.black,
            child: TabBar(
              tabs: [
                Tab(icon: Icon(Icons.directions_car)),
              ],
            ),
          ),
          body: TabBarView(
            children: [
              Navigator(
                onGenerateRoute: (settings) {
                  return MaterialPageRoute(
                    builder: (context) => IconButton(
                        icon: Icon(Icons.directions_car),
                        onPressed: () => Navigator.of(context).push(
                            MaterialPageRoute(
                                builder: (context) => newPage()))),
                  );
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class newPage extends StatelessWidget {
  const newPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("new page"),
      ),
      body: Center(child: Icon(Icons.add)),
    );
  }
}

代码也可用here但是在 dartpad 上你不能测试 android 后退按钮。

最佳答案

首先你应该为你的导航器创建一个键

final GlobalKey<NavigatorState> homeNavigatorKey = GlobalKey();

然后将此键添加到您的导航器

Navigator(
      key: homeNavigatorKey,

然后将您的 Navigator 包装在 WillPopScope 小部件中,并添加 onWillPop,如下所示

child: WillPopScope(
    onWillPop: () async {
      return !(await homeNavigatorKey.currentState!.maybePop());
    },
    child: Navigator(
      key: homeNavigatorKey,

这将检查 navigatorKey 是否可以弹出一个路由,如果是,它只会弹出这条路由,如果不能,它会弹出自己,从而关闭应用程序

关于Android 后退按钮不适用于 Flutter 选项卡内的导航器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70645881/

相关文章:

java - 显示错误\. java.lang.NullPointerException : Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference

flutter - GetStream - Flutter - 连接已可供用户使用

python - 仅在 python 文件中强制执行 "spaces"或 "tabs"?

android - 如何在android 2.2中检查信号是否可用

android - 找不到与给定名称匹配的资源(位于 'theme' ,值为 '@android:style/Theme.my_theme' )。(APT0000)

flutter - 列表包含 'Future<dynamic>' 的实例

emacs - 如何在 emacs 中获取选项卡

java - 打开和在选项卡之间切换时如何更新 FirefoxDriver (WebDriver) 对象?

android-maven-plugin:将proguard绑定(bind)到后期

flutter - 选择下拉按钮时文本字段焦点卡住