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

Flutter中Jikan API请求遇CastError:空值检查运算符触发异常

问题分析与解决方案

你的报错根源有两个核心问题:

  1. snapshot.hasData仅能保证snapshot.data不为null,但snapshot.data.data(API返回的实际动漫数据字段)仍可能为null,直接用!强制解包会触发空指针异常。
  2. 当动漫无工作室数据时,studios可能是空数组而非null,此时studios![0]会触发数组越界错误,这才是无studio数据时的报错主因。

以下是修复后的完整代码:

FutureBuilder<am.AnimeModel>(
  future: getAnimeById(widget.malId),
  builder: (context, snapshot) {
    // 处理加载中状态
    if (snapshot.connectionState == ConnectionState.waiting) {
      return const Center(child: CustomLoadingAnimation());
    }
    // 处理API请求错误
    if (snapshot.hasError) {
      return Center(child: Text('加载失败: ${snapshot.error}'));
    }
    // 双重判空:确保API返回的核心数据非空
    final animeData = snapshot.data?.data;
    if (animeData == null) {
      return const Center(child: Text('暂无动漫数据'));
    }

    // 安全处理工作室数据:先判断数组是否非空
    String studioName = '--';
    if (animeData.studios != null && animeData.studios!.isNotEmpty) {
      studioName = animeData.studios![0].name ?? '--';
    }

    // 安全处理图片链接
    String? imageUrl = animeData.images?.jpg?.largeImageUrl;

    return AnimeDataCardWidget(
      malId: animeData.malId,
      pic: imageUrl ?? '你的默认占位图链接', // 替换为实际占位图地址
      title: animeData.title ?? '无标题',
      totalEpisode: animeData.episodes ?? 0,
      studios: studioName,
      originalManga: animeData.source ?? '未知来源',
      frenchVersion: animeData.titles,
      creationDate: animeData.airing,
      futureData: getFavAnimesId(),
      score: animeData.score ?? 0.0,
    );
  },
),

关键优化点

  • 补充了ConnectionState.waiting和hasError的状态处理,覆盖所有可能的请求状态,避免逻辑漏洞。
  • 用snapshot.data?.data替代强制解包,再显式判空,彻底避免空指针。
  • 对studios的判断改为先检查数组是否非空,再取第一个元素的名称,同时处理名称为null的情况。
  • 对所有可能为null的字段(标题、集数、评分等)添加了null合并运算符,确保字段缺失时不会崩溃。

内容的提问来源于stack exchange,提问作者Clermoe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:53:17