You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:39:35