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持续加载,无法显示新闻列表。
原因分析
- 模型类空值处理缺失:Haber类中所有String字段都标记为
required,但API返回的JSON可能存在null值,直接赋值会触发类型转换错误。 - 加载状态变量未赋值:页面中的
counter变量从未被设置值,导致始终判定为null,一直显示加载指示器。 - 枚举解析容错不足:若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
相关产品推荐
相关产品推荐

