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

Flutter解析RSS Feed遇RssFeed.fromJson及空安全参数错误求助

修复Flutter读取RSS Feed的两个错误

错误1:Member not found: 'RssFeed.fromJson'

原因

你使用的webfeed包中的RssFeed类没有fromJson构造方法,该包原生支持直接解析XML内容,无需通过xml2json转换为JSON再解析。另外,http.get要求传入合法的Uri对象,你用as Uri强制转换字符串的方式是错误的,需用Uri.parse()生成正确的Uri实例。

修复后的_fetchFeed方法

Future<RssFeed> _fetchFeed() async {
  final response = await http.get(Uri.parse('http://www.tusciaweb.eu/feed/'));
  if (response.statusCode == 200) {
    // 直接使用webfeed内置的parse方法解析XML
    return RssFeed.parse(response.body);
  } else {
    throw Exception('Failed to load feed');
  }
}

错误2:Nullable字符串无法赋值给Text的非Nullable参数

原因

Dart空安全机制下,item?.title和item?.pubDate?.toString()均为可空类型(String?),而Text组件的构造参数要求非空的String,必须处理空值情况。同时feed?.items?.length是int?,ListView.builder的itemCount需要非空的int,也需添加兜底逻辑。

修复后的build方法关键部分

Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: const Text('News'),
    ),
    body: FutureBuilder(
      future: _feed,
      builder: (context, snapshot) {
        if (snapshot.hasError) {
          return Center(
            child: Text('Error: ${snapshot.error}'),
          );
        }
        if (!snapshot.hasData) {
          return const Center(
            child: CircularProgressIndicator(),
          );
        }
        // 已通过hasData确认非空,直接强制解包
        RssFeed feed = snapshot.data!;
        return ListView.builder(
          // 空值兜底为0,避免itemCount为null
          itemCount: feed.items?.length ?? 0,
          itemBuilder: (context, index) {
            var item = feed.items![index];
            return Card(
              child: ListTile(
                // 空值兜底为空字符串,也可替换为自定义默认文本如'无标题'
                title: Text(item.title ?? ''),
                subtitle: Text(item.pubDate?.toString() ?? ''),
                onTap: () {
                  // TODO: Navigate to article detail page
                },
              ),
            );
          },
        );
      },
    ),
  );
}

额外说明

  • 若你确认RSS Feed返回的items字段不会为空,可直接使用feed.items!,但保留?? 0的兜底逻辑能提升代码健壮性。
  • 针对item.title的空值处理,可根据产品需求替换为更友好的默认文本,比如'暂无标题'。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 21:11:29