Flutter调用API报错:_InternalLinkedHashMap无'name' getter的解决方法
问题
在Flutter中调用新闻API时遇到错误:Class '_InternalLinkedHashMap<String, dynamic>' has no instance getter 'name'。已定义Economylist和ResultClass模型类,但无法正确获取数据中的name、source字段,怀疑是模型解析存在问题,该如何修复?
问题分析
报错核心原因是**Economylist类的result列表未被解析为ResultClass实例**,而是保留了原始的Map<String, dynamic>类型。当尝试访问haberResult?.result[index].name时,实际是给Map对象调用name getter,因此触发错误。
修复方案
1. 修正模型类的解析逻辑
将Economylist中的result类型从List<dynamic>改为List<ResultClass>,并在fromJson方法中把每个JSON对象解析为ResultClass实例,同时为ResultClass的字段增加空值容错处理:
// To parse this JSON data, do // // final economylist = economylistFromJson(jsonString); import 'dart:convert'; Economylist economylistFromJson(String str) => Economylist.fromJson(json.decode(str)); String economylistToJson(Economylist data) => json.encode(data.toJson()); class Economylist { Economylist({ required this.success, required this.result, }); bool success; List<ResultClass> result; // 修正为强类型列表 factory Economylist.fromJson(Map<String, dynamic> json) => Economylist( success: json["success"], // 将每个JSON对象解析为ResultClass实例 result: List<ResultClass>.from(json["result"].map((x) => ResultClass.fromJson(x))), ); Map<String, dynamic> toJson() => { "success": success, "result": List<dynamic>.from(result.map((x) => x.toJson())), }; } class ResultClass { ResultClass({ required this.key, required this.url, required this.description, required this.image, required this.name, required this.source, }); String key; String url; String description; String image; String name; String source; factory ResultClass.fromJson(Map<String, dynamic> json) => ResultClass( key: json["key"] ?? "", // 空值容错,避免字段缺失崩溃 url: json["url"] ?? "", description: json["description"] ?? "", image: json["image"] ?? "", name: json["name"] ?? "", source: json["source"] ?? "", ); Map<String, dynamic> toJson() => { "key": key, "url": url, "description": description, "image": image, "name": name, "source": source, }; }
2. 调整UI代码的类型访问与容错
修正counter的类型定义,修复setState前的语法错误,并优化列表项的空值处理:
import 'package:flutter/material.dart'; import 'package:halkaarzhisseler/models/apis/economy_api.dart'; import 'package:http/http.dart' as http; class Economy extends StatefulWidget { const Economy({Key? key}) : super(key: key); @override State<Economy> createState() => _EconomyState(); } class _EconomyState extends State<Economy> { final scaffoldKey = GlobalKey<ScaffoldState>(); final url = Uri.parse('https://api.collectapi.com/news/getNews?country=tr&tag=economy'); int? counter; // 明确类型为可空int Economylist? haberResult; Future<void> callHaber() async { try { Map<String, String> requestHeaders = { 'Content-Type': 'application/json', 'Authorization': 'apikey xxx' }; final response = await http.get(url, headers: requestHeaders); if (response.statusCode == 200) { final result = economylistFromJson(response.body); if (mounted) { // 修复原语法错误,确保组件挂载时更新状态 setState(() { counter = result.result.length; haberResult = result; }); } } else { print('请求失败:${response.statusCode}'); } } catch (e) { print('请求异常:${e.toString()}'); } } @override void initState() { super.initState(); callHaber(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( centerTitle: false, automaticallyImplyLeading: false, title: const Text('Hisseler'), ), body: Padding( padding: const EdgeInsets.all(8.0), child: counter != null ? ListView.builder( itemCount: counter, itemBuilder: (context, index) { final newsItem = haberResult?.result[index]; return Card( child: ListTile( title: Text(newsItem?.name ?? '无标题'), subtitle: Text(newsItem?.source ?? '无来源'), ), ); }, ) : const Center(child: CircularProgressIndicator()), ), ); } }
关键优化点
- 强类型解析:确保
result列表中的每个元素都是ResultClass实例,而非原始Map,解决属性访问报错问题。 - 空值容错:为模型字段增加默认值,避免API返回字段缺失时崩溃。
- 语法修复:修正
if(mounted);的无效判断,防止组件卸载后调用setState。
内容的提问来源于stack exchange,提问作者Mıktad Tahir Durak
相关产品推荐
相关产品推荐

