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

Flutter调用Twitter API使用tweet_ui包报Null不是double子类型错误

问题原因

dart_twitter_api包返回的Tweet JSON结构和tweet_ui包中Tweet.fromJson要求的结构不匹配,两者对字段的类型、命名、嵌套规则的定义存在差异。

解决步骤

  • 第一步:先定位具体不匹配的字段
    把解析逻辑套入try-catch打印错误详情,精准定位问题字段:
Widget buildEmbeddedTweetView(Map<String,dynamic> jsonFile, bool darkMode) {
  try {
    final tweet = ui.Tweet.fromJson(jsonFile);
    return Container(
      margin: EdgeInsets.only(left: 15, right: 15, top: 20),
      child: EmbeddedTweetView.fromTweet(
        tweet,
        backgroundColor: darkMode ? Colors.grey[800]! : Colors.white,
        darkMode: darkMode,
        createdDateDisplayFormat: DateFormat("EEE, MMM d, ''yy"),
      ),
    );
  } catch (e, stackTrace) {
    // 打印错误信息定位不匹配字段
    debugPrint("Tweet解析错误:$e");
    debugPrint("错误栈:$stackTrace");
    return const Text("推文解析失败");
  }
}
  • 第二步:新增JSON适配层,把dart_twitter_api返回的原始JSON转换成tweet_ui兼容的结构,常见的适配逻辑参考如下:
Map<String, dynamic> adaptTweetForTweetUi(Map<String, dynamic> rawJson) {
  final adaptedJson = Map<String, dynamic>.from(rawJson);
  
  // 适配id字段:多数情况dart_twitter_api返回字符串类型的id,tweet_ui要求数字类型
  adaptedJson['id'] = int.tryParse(rawJson['id_str'] ?? rawJson['id'].toString()) ?? 0;
  
  // 适配用户信息字段
  if (rawJson['user'] != null) {
    final adaptedUser = Map<String, dynamic>.from(rawJson['user']);
    adaptedUser['id'] = int.tryParse(rawJson['user']['id_str'] ?? rawJson['user']['id'].toString()) ?? 0;
    // 适配头像字段,优先取https的头像地址
    adaptedUser['profile_image_url'] ??= rawJson['user']['profile_image_url_https'];
    adaptedJson['user'] = adaptedUser;
  }
  
  // 递归适配转发推文、引用推文的嵌套结构
  if (rawJson['retweeted_status'] != null) {
    adaptedJson['retweeted_status'] = adaptTweetForTweetUi(rawJson['retweeted_status']);
  }
  if (rawJson['quoted_status'] != null) {
    adaptedJson['quoted_status'] = adaptTweetForTweetUi(rawJson['quoted_status']);
  }
  
  // 其他缺失字段可根据报错补充默认值,例如:
  // adaptedJson['possibly_sensitive'] ??= false;
  
  return adaptedJson;
}
  • 第三步:调用适配方法后再传入解析逻辑
    修改build方法中的调用代码:
child:(homeTile!=null) ? buildEmbeddedTweetView(
    adaptTweetForTweetUi(homeTile![0]), true):CircularProgressIndicator()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:09:04