Flutter如何在void main的runApp执行前合并两项初始化逻辑
问题说明
Dart 应用仅允许存在一个顶级 main() 入口函数,同文件下定义两个main会直接触发语法错误。拆分两个入口分别处理底部导航加载、Easy Localization 国际化初始化的写法,本质是没有把启动前的初始化逻辑和应用根组件树做整合。
正确整合方式
所有需要在 runApp 前执行的初始化逻辑,统一放到同一个声明为 Future<void> 的异步main函数中执行,执行完所有初始化操作后,再把底部导航、国际化配置嵌套到同一个应用根组件树里启动即可。
注意:涉及异步初始化操作时,必须在main函数最开头调用
WidgetsFlutterBinding.ensureInitialized(),否则会出现Flutter引擎绑定未初始化的报错。
修正后完整代码
Future<void> main() async { // 初始化Flutter引擎绑定 WidgetsFlutterBinding.ensureInitialized(); // 执行Easy Localization国际化初始化 await EasyLocalization.ensureInitialized(); // 所有前置逻辑执行完成后启动应用 runApp( EasyLocalization( supportedLocales: const [Locale('en', 'US'), Locale('it', 'IT'), Locale('fr', 'FR')], path: 'assets/translations', fallbackLocale: const Locale('en', 'US'), assetLoader: CodegenLoader(), // 直接将带底部导航的根组件作为国际化配置的子节点,无需拆分多个App根组件 child: const MyApp(), ), ); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( // 补全国际化必要配置,否则翻译、语言切换不生效 localizationsDelegates: context.localizationDelegates, supportedLocales: context.supportedLocales, locale: context.locale, // 直接挂载底部导航栏作为首页 home: const MyBottomNavBar(), ); } }
关键注意点
- 原有两个重复的main函数直接删除,仅保留上述唯一异步入口即可
- 底部导航栏属于页面组件,不需要在main函数中做特殊初始化,作为MaterialApp的home节点会在应用启动后自动加载
- 不需要单独保留
MyLangApp组件,原有该组件内的国际化相关配置直接合并到MyApp中即可 - MaterialApp必须补上三个国际化相关配置参数,从当前BuildContext读取EasyLocalization注入的配置,否则国际化逻辑不会生效
内容的提问来源于stack exchange,提问作者Giovanni
相关产品推荐
相关产品推荐

