You need to enable JavaScript to run this app. Dart单例调用init初始化方法后属性返回null是什么原因?
优惠活动
大模型
产品
解决方案
定价
更多

Dart单例调用init初始化方法后属性返回null是什么原因?

问题原因
  • 你调用的rootBundle.loadStructuredData属于异步IO操作,内部的JSON解析、属性赋值逻辑会被延后执行。而你原来的init()方法被定义为无返回值的普通方法,调用时不会等待异步操作执行完成,你调用Paths.init()后立刻访问属性时,赋值逻辑还未运行,所以所有属性都是默认的null值。
修复方案
  1. 首先修改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]);
    });
  }
}
  1. 调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 22:15:04