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

Flutter API调用报错:Null不是String子类型及加载异常

解决Flutter中type 'Null' is not a subtype of type 'String'错误及加载状态异常问题

问题描述

调用XML转JSON的API获取经济新闻数据时,控制台抛出type 'Null' is not a subtype of type 'String'错误,同时页面的CircularProgressIndicator持续加载,无法显示新闻列表。

原因分析

  1. 模型类空值处理缺失:Haber类中所有String字段都标记为required,但API返回的JSON可能存在null值,直接赋值会触发类型转换错误。
  2. 加载状态变量未赋值:页面中的counter变量从未被设置值,导致始终判定为null,一直显示加载指示器。
  3. 枚举解析容错不足:若API返回的haber_kategorisi不在枚举映射表中,会返回null,但模型中该字段被标记为required,也会引发异常。

解决方案

1. 修复模型类的空值处理

修改Haber类的构造函数和fromJson方法,为可能为null的字段添加默认值,取消不必要的required标记:

class Haber {
  Haber({
    this.haberManset = "",
    this.haberResim = "",
    this.haberLink = "",
    this.haberId = "",
    this.haberVideo = "",
    this.haberAciklama = "",
    this.haberMetni = "",
    this.haberKategorisi,
    this.haberTarihi = "",
    this.mansetResim = "",
    this.izlesId = "",
    this.yorumSay = "",
    this.okunmaadedi = "",
    this.anasayfamanset = "",
    this.kategorimanset = "",
  });

  String haberManset;
  String haberResim;
  String haberLink;
  String haberId;
  String haberVideo;
  String haberAciklama;
  String haberMetni;
  HaberKategorisi? haberKategorisi;
  String haberTarihi;
  String mansetResim;
  String izlesId;
  String yorumSay;
  String okunmaadedi;
  String anasayfamanset;
  String kategorimanset;

  factory Haber.fromJson(Map<String, dynamic> json) => Haber(
    haberManset: json["haber_manset"] ?? "",
    haberResim: json["haber_resim"] ?? "",
    haberLink: json["haber_link"] ?? "",
    haberId: json["haber_id"] ?? "",
    haberVideo: json["haber_video"] ?? "",
    haberAciklama: json["haber_aciklama"] ?? "",
    haberMetni: json["haber_metni"] ?? "",
    haberKategorisi: haberKategorisiValues.map[json["haber_kategorisi"]],
    haberTarihi: json["haber_tarihi"] ?? "",
    mansetResim: json["manset_resim"] ?? "",
    izlesId: json["izles_id"] ?? "",
    yorumSay: json["yorumSay"] ?? "",
    okunmaadedi: json["okunmaadedi"] ?? "",
    anasayfamanset: json["anasayfamanset"] ?? "",
    kategorimanset: json["kategorimanset"] ?? "",
  );

  // toJson方法保持不变
}

2. 修正加载状态逻辑

在callHaber方法中,成功获取数据后为counter赋值,同时处理请求失败和异常情况,避免无限加载:

Future callHaber() async {
  try{
    final response = await http.get(url);

    if(response.statusCode == 200){
      var haberler = economylistXmlFromJson(response.body);

      if(mounted){
        setState(() {
          haberResult = haberler;
          counter = haberler.haberler.haber.length;
        });
      }
      return haberler;
    } else {
      print('请求失败,状态码:${response.statusCode}');
      if(mounted){
        setState(() {
          counter = 0;
        });
      }
    }
  } catch(e) {
    print('请求异常:${e.toString()}');
    if(mounted){
      setState(() {
        counter = 0;
      });
    }
  }
}

3. 优化页面空状态显示

在build方法中增加空状态判断,当无数据时显示提示文本:

body: Center(
  child: Padding(
    padding: const EdgeInsets.all(8.0),
    child: counter != null ?
    counter > 0 ?
    ListView.builder(
        itemCount: counter,
        itemBuilder: (context, index){
          return Card(
            child: ListTile(
              title: Text(haberResult?.haberler.haber[index].haberManset??""),
              leading: CircleAvatar(
                backgroundImage: NetworkImage(haberResult?.haberler.haber[index].haberResim??""),),
              onTap: () => Navigator.push(
                context, MaterialPageRoute(builder: (context) => HaberDetailScreen( subtitle: haberResult?.haberler.haber[index].haberMetni??"", title: haberResult?.haberler.haber[index].haberManset??"",image: haberResult?.haberler.haber[index].haberResim??"",)),),
            ),
          );
        }) : Center(child: Text('暂无数据'))
    : Center(child: CircularProgressIndicator()),
  ),
),

内容的提问来源于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 02:48:24