Flutter auto_route路由传参:如何从main向初始路由传递数据?
解决方案:从main函数向AutoRoute初始路由传递数据库数据
方式一:通过路由参数传递
1. 配置初始页面接收参数
假设你的初始页面是MainScreen,给它添加需要的参数并加上@RoutePage注解,让AutoRoute生成对应路由代码:
@RoutePage() class MainScreen extends StatelessWidget { final List<Alarm> alarms; // 替换为你的实际数据模型类型 final DatabaseService databaseService; const MainScreen({ Key? key, required this.alarms, required this.databaseService, }) : super(key: key); @override Widget build(BuildContext context) { // 直接使用传入的参数 return Scaffold( body: Text('已加载 ${alarms.length} 条闹钟数据'), ); } }
2. 生成路由代码
执行命令让AutoRoute生成包含参数的路由相关代码:
flutter pub run build_runner build
3. 在main中传递初始路由参数
修改main.dart,将从数据库获取的alarms和databaseService通过initialRouteData传入初始路由:
Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); await configureLocalTimeZone(); getIt.registerLazySingleton<UserRepositories>(() => UserRepositories()); initializeNotifications(); // 初始化数据库并拉取数据 DatabaseService databaseService = DatabaseService.instance; final alarms = await databaseService.getAlarms(); AppRouter router = AppRouter(); runApp(MyApp( appRouter: router, initialAlarms: alarms, databaseService: databaseService, )); } class MyApp extends StatelessWidget { final AppRouter appRouter; final List<Alarm> initialAlarms; final DatabaseService databaseService; MyApp({ Key? key, required this.appRouter, required this.initialAlarms, required this.databaseService, }) : super(key: key); @override Widget build(BuildContext context) { return MultiBlocProvider( providers: [ BlocProvider<UserBloc>( create: (_) => UserBloc()..add(FetchUser()), ), BlocProvider<LoginBloc>( create: (_) => LoginBloc(userRepository: getIt<UserRepositories>()), ), ], child: MaterialApp.router( routerConfig: appRouter.config( // 通过AutoRoute自动生成的MainRouteData传递参数 initialRouteData: MainRouteData( alarms: initialAlarms, databaseService: databaseService, ), ), ), ); } }
方式二:通过依赖注入(GetIt)传递(适合全局共享场景)
如果多个页面都需要用到alarms或databaseService,直接用GetIt注册全局单例更高效:
1. 在main中注册全局实例
Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); await configureLocalTimeZone(); getIt.registerLazySingleton<UserRepositories>(() => UserRepositories()); initializeNotifications(); DatabaseService databaseService = DatabaseService.instance; final alarms = await databaseService.getAlarms(); // 注册为全局单例 getIt.registerSingleton<DatabaseService>(databaseService); getIt.registerSingleton<List<Alarm>>(alarms); AppRouter router = AppRouter(); runApp(MyApp(appRouter: router)); }
2. 在MainScreen中直接获取实例
@RoutePage() class MainScreen extends StatelessWidget { const MainScreen({Key? key}) : super(key: key); @override Widget build(BuildContext context) { // 直接从GetIt拉取实例 final alarms = getIt<List<Alarm>>(); final databaseService = getIt<DatabaseService>(); return Scaffold( body: Text('已加载 ${alarms.length} 条闹钟数据'), ); } }
两种方式按需选择:路由参数适合仅初始页面需要数据的场景,依赖注入适合多页面共享数据的场景。
内容的提问来源于stack exchange,提问作者Orl13
相关产品推荐
相关产品推荐

