如何在Dart的Lambda函数中返回对象?解决类型不匹配问题
问题解决与方案
1. 解决遍历收集medium返回值的报错问题
你遇到的错误核心原因是**Map.forEach()方法的返回值是void**——不管你在回调里调用的medium返回什么,forEach本身不会返回任何结果,所以直接return lamp.forEach(...)必然会出现类型不匹配的错误。
正确的做法是创建一个空Map,遍历lamp的键值对时,将medium返回的Map结果合并到新Map中,最后返回这个收集好的Map:
实现方式一:使用forEach配合临时Map
Map<String, dynamic> souvenir(Map lamp) { final result = <String, dynamic>{}; lamp.forEach((k, v) { // 假设medium返回的是Map<String, int>,直接合并到结果Map result.addAll(medium(k, v)); }); return result; }
实现方式二:使用for-in遍历Map entries(更直观)
Map<String, dynamic> souvenir(Map lamp) { final result = <String, dynamic>{}; for (final entry in lamp.entries) { final mediumResult = medium(entry.key, entry.value); result.addAll(mediumResult); } return result; }
如果medium返回的是单个键值对(比如每个k,v对应一个唯一的键值),也可以直接赋值:
result[targetKey] = medium(entry.key, entry.value)[targetKey];
2. 无需声明对象的JSON转换方案
json_annotation包主要用于实体类和JSON的自动转换,如果你不想声明对象,直接用Dart内置的dart:convert库即可完成Map和JSON的转换:
基础转换
- Map转JSON字符串:
import 'dart:convert'; String mapToJson(Map<String, dynamic> map) => jsonEncode(map); - JSON字符串转Map:
import 'dart:convert'; Map<String, dynamic> jsonToMap(String jsonStr) => jsonDecode(jsonStr) as Map<String, dynamic>;
封装类似.toJson()的方法
如果想让Map直接拥有.toJson()方法,可以通过扩展方法实现:
import 'dart:convert'; extension MapJsonExtension on Map<String, dynamic> { String toJson() => jsonEncode(this); } // 使用方式 final myMap = {'name': 'test', 'count': 1}; final jsonStr = myMap.toJson();
内容的提问来源于stack exchange,提问作者Literalomicus
相关产品推荐
相关产品推荐

