You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 17:05:55