我正在使用 AutoRoute flutter 包中的声明式路由。
class App extends StatelessWidget {
final _appRouter = AppRouter();
@override
Widget build(BuildContext context) {
return MaterialApp.router(
routerDelegate: AutoRouterDelegate.declarative(
_appRouter,
routes: (_) => [
// if the user is logged in, they may proceed to the main App
if (authService().isLoggedIn)
HomeRoute()
// if they are not logged in, bring them to the Login page
else
LoginWrapperRoute(onLogin: () => authService().logIn),
],
),
routeInformationParser:
_appRouter.defaultRouteParser(includePrefixMatches: true));
}
}
IconButton(
onPressed: () {
context.pushRoute(const AlarmRoute());
},
icon: const Icon(Icons.notifications_active),
color: const Color(0xFF666666),
)
当我尝试推送或导航到页面时,出现以下错误: Widget':页面堆栈可以由 Widget (AutoRouter.declarative) 或 (StackRouter) 来管理
根据
auto_route
的作者对他们的评论:
如果您使用 声明式导航,
。 。你有 选择一个。 还有很多问题尚未解决,因此如果context.pushRoute
AutoRouterDelegate.declarative
能够实施改进那就太好了。
我的解决方案:auto_route
的“声明式”方法,但我仍然有类似的代码。在我的应用程序的根目录附近,我有:
auto_route
我的
return AnimatedBuilder(
animation: settingsController,
builder: (BuildContext context, Widget? child) {
return MaterialApp.router(
restorationScopeId: 'app',
routerDelegate: _appRouter.delegate(
initialRoutes: (settingsController.settings.showOnboarding)
? [const OnboardingRoute()]
: [CurrentPoseRoute()]),
routeInformationParser: _appRouter.defaultRouteParser(),
theme: ThemeData(),
darkTheme: ThemeData.dark(),
themeMode: settingsService.settings.themeMode.toMaterial(),
);
},
);
使用 mixin
settingsController
,所以我可以使用 ChangeNotifier
。这确实构建了一大块小部件树。对我来说,这并不重要,因为我在从入门切换到正常用户流程时使用它。
使用 2 个路由器:AppRouter 和 AuthRouter。
main.dart:
void main() async {
var isAuthenticated = await authService.state;
// native splash screen is showing until runApp is called
runApp(MyApp(authenticated: isAuthenticated));
}
class MyApp extends StatelessWidget {
final _appRouter = AppRouter();
final bool authenticated;
MyApp({Key? key, required this.authenticated}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp.router(
theme: ThemeData.dark(),
routerDelegate: _appRouter.delegate(
initialRoutes: [if (authenticated) HomeRoute() else LoginRoute()],
),
}
class GApp extends StatefulWidget { const GApp({super.key}); @override State<GApp> createState() => _GAppState(); } class _GAppState extends State<GoApp> { final _appRouter = AppRouter(); final _authRouter = AuthRouter(); final _authController = AuthController(); // This widget is the root of your application. @override Widget build(BuildContext context) { return MultiBlocProvider( providers: [ RepositoryProvider<BaseNetwork>( create: (context) => BaseNetwork( DioService.dioCore(baseUrl: 'baseUrl', header: {}), ), ), BlocProvider(create: (context) => _authController), ], child: BlocBuilder<AuthController, AuthControllerState>( builder: (context, state) { return MaterialApp.router( title: 'Gabaf', routerConfig: context.read<AuthController>().isLoggedIn ? _appRouter.config() : _authRouter.config(), ); }), ); } }