Здравствуйте, у меня возникла проблема с установкой и запуском пакета auto_route
в проекте Flutter. Следуя официальной документации, я сделал следующее:
@MaterialAutoRouter
--enable-experiment=enhanced-enums
)MaterialApp
Когда я пытаюсь запустить приложение с помощью flutter run
, мне выдается следующее сообщение об ошибке:
lib/app_router.gr.dart:16:26: Error: Type 'NavigatorState' not found.
_$AppRouter([GlobalKey<NavigatorState>? navigatorKey]) : super(navigatorKey);
^^^^^^^^^^^^^^
lib/app_router.gr.dart:16:16: Error: Type 'GlobalKey' not found.
_$AppRouter([GlobalKey<NavigatorState>? navigatorKey]) : super(navigatorKey);
^^^^^^^^^
lib/app_router.gr.dart:16:26: Error: 'NavigatorState' isn't a type.
_$AppRouter([GlobalKey<NavigatorState>? navigatorKey]) : super(navigatorKey);
^^^^^^^^^^^^^^
lib/app_router.gr.dart:16:16: Error: 'GlobalKey' isn't a type.
_$AppRouter([GlobalKey<NavigatorState>? navigatorKey]) : super(navigatorKey);
Вывод flutter --version
:
Flutter 3.0.0 • channel stable • https://github.com/flutter/flutter.git
Framework • revision ee4e09cce0 (3 days ago) • 2022-05-09 16:45:18 -0700
Engine • revision d1b9a6938a
Tools • Dart 2.17.0 • DevTools 2.12.2
Выдержка из файла pubspec.yaml
с соответствующими зависимостями
environment:
sdk: ">=2.17.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
auto_route: ^4.0.1
dev_dependencies:
auto_route_generator: ^4.0.0
build_runner: ^2.1.10
(1) Класс-заполнитель (app_router.dart
), аннотированный @MaterialAutoRouter
...
part 'app_router.gr.dart';
const authRoutes = AutoRoute(
name: 'AuthRouter',
path: '/',
initial: true,
page: LoginScreen,
);
@MaterialAutoRouter(
routes: <AutoRoute>[authRoutes],
)
class AppRouter extends _$AppRouter {}
...и автоматически сгенерированный код команды (2) flutter pub run build_runner build --enable-experiment=enhanced-enums --delete-conflicting-outputs
(app_router.gr.dart
)
// **************************************************************************
// AutoRouteGenerator
// **************************************************************************
// GENERATED CODE - DO NOT MODIFY BY HAND
// **************************************************************************
// AutoRouteGenerator
// **************************************************************************
//
// ignore_for_file: type=lint
part of 'app_router.dart';
class _$AppRouter extends RootStackRouter {
_$AppRouter([GlobalKey<NavigatorState>? navigatorKey]) : super(navigatorKey);
@override
final Map<String, PageFactory> pagesMap = {
AuthRouter.name: (routeData) {
return MaterialPageX<dynamic>(
routeData: routeData, child: const LoginScreen());
}
};
@override
List<RouteConfig> get routes => [RouteConfig(AuthRouter.name, path: '/')];
}
/// generated route for
/// [LoginScreen]
class AuthRouter extends PageRouteInfo<void> {
const AuthRouter() : super(AuthRouter.name, path: '/');
static const String name = 'AuthRouter';
}
Наконец, (3), вот как я подключил его к MaterialApp
:
class App extends StatelessWidget {
final AppRouter _router = AppRouter();
App({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp.router(
routerDelegate: _router.delegate(),
routeInformationParser: _router.defaultRouteParser(),
debugShowCheckedModeBanner: false,
theme: AppTheme.lightThemeData(context),
);
}
}
Вчера я перешел на Flutter 3 и одновременно начал использовать расширенные перечисления. Без флага --enable-experiment=enhanced-enums
генератор кода не работает. Я пытался запустить приложение (flutter run
) с одним и тем же флагом и без него, но вышеупомянутая ошибка сохраняется.
Если у кого-то есть какие-либо идеи о том, что могло потенциально пойти не так, любая помощь будет принята с благодарностью. Спасибо.
Хорошо, я нашел решение. Это тривиально и вызвано неполной документацией. Просматривая страницу проблем auto_route
GitHub, я нашел это от 1 декабря 2021 года.
Исправление состоит в том, чтобы добавить
import 'package:flutter/material.dart';
в класс-заполнитель (в моем случае 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 {}
Изменить (16 марта 2022 г.): как указал Йоги Ариф Видодо в комментарии ниже, вы можете захотеть импортировать и Материал, и Купертино, если вам это нужно.
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
приятно
import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart';
спасибо...