Flutter初始化器无法访问实例成员_setFilters报错如何修复?
报错原因
Dart类的初始化顺序中,类字段的初始化器执行阶段,类实例还未完全创建完成,无法访问未初始化完成的实例成员。你代码中直接将routes定义为类的final字段,初始化时直接引用了实例方法_setFilters和实例变量_availableMeals,因此触发报错。
解决方案
有两种常用修复方案,选择任意一种即可:
方案1:将路由表改为动态getter(改动最小)
将原来的routes字段定义替换为getter,getter会在每次被调用时动态生成路由表,此时State实例已完成初始化,可以正常访问实例成员:
// 替换原有的final routes = ... 代码段 Map<String, WidgetBuilder> get routes => <String, WidgetBuilder>{ TabsScreen.tag: (context) => TabsScreen(), HomePage.tag: (context) => HomePage(), FilterPage.tag: (context) => FilterPage(_setFilters), CategoryMealScreen.tag: (context) => CategoryMealScreen(_availableMeals), MealDetailScreen.tag: (context) => MealDetailScreen(), };
方案2:改用onGenerateRoute处理路由
删除静态路由表配置,在MaterialApp中通过onGenerateRoute回调处理路由跳转,回调执行时实例已初始化完成,可以正常访问实例成员:
@override Widget build(BuildContext context) { const String _category = 'Categories'; return MaterialApp( title: _category, home: TabsScreen(), debugShowCheckedModeBanner: false, onGenerateRoute: (settings) { switch (settings.name) { case TabsScreen.tag: return MaterialPageRoute(builder: (context) => TabsScreen()); case HomePage.tag: return MaterialPageRoute(builder: (context) => HomePage()); case FilterPage.tag: return MaterialPageRoute(builder: (context) => FilterPage(_setFilters)); case CategoryMealScreen.tag: return MaterialPageRoute(builder: (context) => CategoryMealScreen(_availableMeals)); case MealDetailScreen.tag: return MaterialPageRoute(builder: (context) => MealDetailScreen()); default: return MaterialPageRoute(builder: (ctx) => HomePage()); } }, onUnknownRoute: (settings) { return MaterialPageRoute( builder: (ctx) => HomePage(), ); }, ); }
内容的提问来源于stack exchange,提问作者Punlork Chek
相关产品推荐
相关产品推荐

