Flutter auto_router:错误:找不到类型“NavigatorState”

sun*_*ree 3 code-generation dart flutter flutter-dependencies

问题总结

\n

auto_route您好,我在 Flutter 项目中启动和运行软件包时遇到问题。根据官方文档,我做了以下工作:

\n
    \n
  1. 创建了一个占位符类,注释为@MaterialAutoRouter
  2. \n
  3. 运行代码生成器(使用--enable-experiment=enhanced-enums
  4. \n
  5. 连接路由器类MaterialApp
  6. \n
\n

当我尝试使用 运行应用程序时flutter run,这是我收到的错误消息:

\n
lib/app_router.gr.dart:16:26: Error: Type \'NavigatorState\' not found.\n  _$AppRouter([GlobalKey<NavigatorState>? navigatorKey]) : super(navigatorKey);\n                         ^^^^^^^^^^^^^^\nlib/app_router.gr.dart:16:16: Error: Type \'GlobalKey\' not found.\n  _$AppRouter([GlobalKey<NavigatorState>? navigatorKey]) : super(navigatorKey);\n               ^^^^^^^^^\nlib/app_router.gr.dart:16:26: Error: \'NavigatorState\' isn\'t a type.\n  _$AppRouter([GlobalKey<NavigatorState>? navigatorKey]) : super(navigatorKey);\n                         ^^^^^^^^^^^^^^\nlib/app_router.gr.dart:16:16: Error: \'GlobalKey\' isn\'t a type.\n  _$AppRouter([GlobalKey<NavigatorState>? navigatorKey]) : super(navigatorKey);\n
Run Code Online (Sandbox Code Playgroud)\n

附加信息

\n

的输出flutter --version

\n
Flutter 3.0.0 \xe2\x80\xa2 channel stable \xe2\x80\xa2 https://github.com/flutter/flutter.git\nFramework \xe2\x80\xa2 revision ee4e09cce0 (3 days ago) \xe2\x80\xa2 2022-05-09 16:45:18 -0700\nEngine \xe2\x80\xa2 revision d1b9a6938a\nTools \xe2\x80\xa2 Dart 2.17.0 \xe2\x80\xa2 DevTools 2.12.2\n
Run Code Online (Sandbox Code Playgroud)\n

pubspec.yaml具有相关依赖项的文件摘录

\n
lib/app_router.gr.dart:16:26: Error: Type \'NavigatorState\' not found.\n  _$AppRouter([GlobalKey<NavigatorState>? navigatorKey]) : super(navigatorKey);\n                         ^^^^^^^^^^^^^^\nlib/app_router.gr.dart:16:16: Error: Type \'GlobalKey\' not found.\n  _$AppRouter([GlobalKey<NavigatorState>? navigatorKey]) : super(navigatorKey);\n               ^^^^^^^^^\nlib/app_router.gr.dart:16:26: Error: \'NavigatorState\' isn\'t a type.\n  _$AppRouter([GlobalKey<NavigatorState>? navigatorKey]) : super(navigatorKey);\n                         ^^^^^^^^^^^^^^\nlib/app_router.gr.dart:16:16: Error: \'GlobalKey\' isn\'t a type.\n  _$AppRouter([GlobalKey<NavigatorState>? navigatorKey]) : super(navigatorKey);\n
Run Code Online (Sandbox Code Playgroud)\n

代码和其他尝试

\n

(1) 占位符类 ( app_router.dart) 注释为@MaterialAutoRouter...

\n
Flutter 3.0.0 \xe2\x80\xa2 channel stable \xe2\x80\xa2 https://github.com/flutter/flutter.git\nFramework \xe2\x80\xa2 revision ee4e09cce0 (3 days ago) \xe2\x80\xa2 2022-05-09 16:45:18 -0700\nEngine \xe2\x80\xa2 revision d1b9a6938a\nTools \xe2\x80\xa2 Dart 2.17.0 \xe2\x80\xa2 DevTools 2.12.2\n
Run Code Online (Sandbox Code Playgroud)\n

flutter pub run build_runner build --enable-experiment=enhanced-enums --delete-conflicting-outputs...以及 (2)命令 ( app_router.gr.dart)自动生成的代码

\n
environment:\n  sdk: ">=2.17.0 <3.0.0"\n\ndependencies:\n  flutter:\n    sdk: flutter\n  auto_route: ^4.0.1\n \ndev_dependencies:\n  auto_route_generator: ^4.0.0\n  build_runner: ^2.1.10\n
Run Code Online (Sandbox Code Playgroud)\n

最后,(3),这就是我将其与以下连接起来的方式MaterialApp

\n
part \'app_router.gr.dart\';\n\nconst authRoutes = AutoRoute(\n  name: \'AuthRouter\',\n  path: \'/\',\n  initial: true,\n  page: LoginScreen,\n);\n\n@MaterialAutoRouter(\n  routes: <AutoRoute>[authRoutes],\n)\nclass AppRouter extends _$AppRouter {}\n
Run Code Online (Sandbox Code Playgroud)\n

我昨天已经迁移到 Flutter 3,同时也开始使用增强型枚举。如果没有该--enable-experiment=enhanced-enums标志,代码生成器似乎无法工作。我尝试过flutter run使用或不使用相同标志来运行应用程序 ( ),但上述错误仍然存​​在。

\n

如果有人知道可能出现什么问题,我们将不胜感激。谢谢。

\n

sun*_*ree 6

好的,我找到了解决方案。这是微不足道的,是由不完整的文档造成的。浏览auto_routeGitHub 问题页面后,我发现了这个,2021 年 12 月 1 日起。

修复方法是添加

import 'package:flutter/material.dart';
Run Code Online (Sandbox Code Playgroud)

到占位符类(在我的例子中,app_router.dart)。所以,

// + other relevant imports
import 'package:flutter/material.dart';

part 'app_router.gr.dart';

const authRoutes = AutoRoute(
  name: 'AuthRouter',
  path: '/',
  initial: true,
  page: LoginScreen,
);

@MaterialAutoRouter(
  routes: <AutoRoute>[authRoutes],
)
class AppRouter extends _$AppRouter {}
Run Code Online (Sandbox Code Playgroud)

编辑(2022 年 3 月 16 日):正如 Yogi Arif Widodo 在下面的评论中指出的那样,如果您需要的话,您可能想导入 Material 和 Cupertino

import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
Run Code Online (Sandbox Code Playgroud)