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
相关产品推荐
相关产品推荐

