Dart单例调用init初始化方法后属性返回null是什么原因?
问题原因
- 你调用的
rootBundle.loadStructuredData属于异步IO操作,内部的JSON解析、属性赋值逻辑会被延后执行。而你原来的init()方法被定义为无返回值的普通方法,调用时不会等待异步操作执行完成,你调用Paths.init()后立刻访问属性时,赋值逻辑还未运行,所以所有属性都是默认的null值。
修复方案
- 首先修改
init()方法的定义,将其改为返回Future<void>的异步方法,内部await等待loadStructuredData执行完成:
class Paths { static final Paths _paths = Paths._internal(); String? authority; String? genders; Map<String, String>? email; Map<String, String>? account; Map<String, String>? story; Map<String, String>? user; factory Paths() => _paths; Paths._internal(); // 修改为返回Future的异步方法 static Future<void> init() async { await rootBundle.loadStructuredData<void>('assets/paths/paths.json', (jsonStr) async { Map<String, dynamic> data = jsonDecode(jsonStr); _paths.authority = data[Strings.authority] as String; _paths.genders = data[Strings.genders] as String; _paths.email = Map<String,String>.from(data[Strings.email]); _paths.account = Map<String,String>.from(data[Strings.account]); _paths.story = Map<String,String>.from(data[Strings.story]); _paths.user = Map<String,String>.from(data[Strings.user]); }); } }
- 调用
init()时必须加await等待初始化完成后,再访问单例的属性:
// 必须在异步函数上下文中调用 await Paths.init(); Paths paths = Paths(); print(paths.authority); // 可正常输出预期值
额外建议
如果是Flutter项目,建议在应用启动阶段就完成配置初始化,避免后续使用时再等待:
void main() async { // 初始化Flutter绑定 WidgetsFlutterBinding.ensureInitialized(); // 等待配置加载完成再启动应用 await Paths.init(); runApp(const MyApp()); }
内容的提问来源于stack exchange,提问作者NelsonThiago
相关产品推荐
相关产品推荐

