如何修复Flutter GetX中的Unhandled Exception: NoSuchMethodError错误
问题分析与修复
你遇到的NoSuchMethodError: The method 'map' was called on null,核心原因是模型层级搞混+数据解析逻辑错误:
- 你的
Regiones类是整个JSON的顶层模型(包含name: Chile和regions数组),但你在Controller里错误地把JSON中regions数组的每个子元素当作Regiones对象解析——这些子元素实际是Region类型的结构,没有regions字段,导致Regiones.fromJson方法里调用json["regions"].map()时,json["regions"]为null,触发报错。 - 你的
regionList声明为<Regiones>[].obs,但实际要存储的是Region对象列表,类型不匹配。
修复步骤
1. 修正Controller的逻辑与类型
把regionList的类型改为<Region>[].obs,同时修改getRegiones方法,先解析整个JSON为Regiones实例,再取出里面的regions列表:
class HomeController extends GetxController { // 修正类型:存储Region对象列表 var regionList = <Region>[].obs; Future<List<Region>> getRegiones() async { var response = await rootBundle.loadString('assets/response.json'); // 先解析整个JSON为Regiones顶层对象 Regiones regiones = Regiones.fromJson(jsonDecode(response)); // 返回里面的regions列表(List<Region>) return regiones.regions; } @override Future<void> onInit() async { super.onInit(); regionList.assignAll(await getRegiones()); } }
2. 给Model的Regiones.fromJson加空安全处理
防止JSON中regions字段为null时触发报错:
factory Regiones.fromJson(Map<String, dynamic> json) => Regiones( name: json["name"] ?? "", // 加空判断,若json["regions"]为null则返回空列表 regions: List<Region>.from( (json["regions"] ?? []).map((x) => Region.fromJson(x)) ), );
3. 优化HomePage代码(可选)
因为你用了GetView<HomeController>,可以直接用controller变量,不需要再Get.find():
class HomePage extends GetView<HomeController> { const HomePage({super.key}); @override Widget build(BuildContext context) { return Scaffold( body: Obx(() { return controller.regionList.isEmpty ? const Center(child: Text('No hay regiones')) : ListView.builder( itemCount: controller.regionList.length, itemBuilder: (context, index) => ListTile( title: Text(controller.regionList[index].name ?? ""), ), ); }), ); } }
关键说明
- 理清模型层级:顶层是
Regiones(对应整个JSON),里面的regions字段是List<Region>(对应每个地区数据)。 - 空安全处理:在解析JSON时,对可能为null的字段加默认值,避免调用
map()等方法时触发null错误。
内容的提问来源于stack exchange,提问作者Pablo bustamante
相关产品推荐
相关产品推荐

