Dart 向Map写入键值对后打印返回null的问题如何解决
问题成因
- 你声明的可空类型变量
Map<String, String>? testMap没有进行初始化,默认初始值为null。 - Dart中空安全调用符
?[]的执行逻辑是「左侧对象为null时直接跳过后续操作」,你用到的testMap?["display_name"] = xxx写法,会因为testMap本身是null直接跳过赋值逻辑,不会触发任何写入操作,最终变量依然为null。 - 额外排查项:如果完成初始化后依然取不到值,需要确认
if (item.contains(contact))条件是否成功命中,没有命中的话赋值逻辑同样不会执行。
解决方法
两种方案二选一即可:
方案1:声明时直接初始化
直接在声明变量时赋值空Map实例,后续写入操作可直接生效:
// 可空类型初始化 Map<String, String>? testMap = {}; // 如果后续不会将testMap赋值为null,建议直接用非可空类型,无需额外空判断 // Map<String, String> testMap = {};
方案2:写入前判空初始化
如果不想在声明时初始化,可以在写入键值对前加判空初始化逻辑,只有首次需要写入时才会创建Map实例:
result.forEach((item) { if (item.contains(contact)) { // 若testMap为null则初始化空Map testMap ??= {}; testMap!["display_name"] = test[i].displayName; testMap!["phone_number"] = test[i].phones[x].number; } });
注:初始化完成后
testMap已确认非空,可用!操作符直接操作避免空判断开销。
内容的提问来源于stack exchange,提问作者Sumchans
相关产品推荐
相关产品推荐

