我在尝试使用 rss 访问数据时遇到问题

时间:2021-03-10 04:06:51

标签: rest flutter rss

错误消息:未处理的异常:类型“_InternalLinkedHashMap”不是“FutureOr”类型的子类型

import 'dart:convert';

import 'package:xml2json/xml2json.dart';
import 'package:http/http.dart' as http;

Future<List> rssToJson(String category,
    {String baseUrl="https://www.hindustantimes.com/feeds/rss/"}) async {
  var client = http.Client();
  final myTransformer = Xml2Json();
  return await client.get(baseUrl + category + '/rssfeed.xml').then((response) {
    return response.body;
  }).then((bodyString) {
    myTransformer.parse(bodyString);
    var json = myTransformer.toGData();
    return jsonDecode(json)['rss']['channel']['item'];
  });
}

这是我尝试使用从 rss 收到的数据的地方:

Map<String, List> newsData = Map<String, List>();
bool isLoading = true;
getData() async{
    Future.wait([
      rssToJson('topnews'),
      rssToJson('india'),
      rssToJson('world-news'),
      rssToJson('business'),
      rssToJson('sports'),
      rssToJson('cricket'),
      rssToJson('education'),
      rssToJson('entertainment'),
      rssToJson('lifestyle'),
      rssToJson('health'),
      rssToJson('books'),
      rssToJson('trending'),
    ]).then((value) {
      value[0] = [];
      value.forEach((element) {
        value[0].addAll([...element ?? []]);
      });
      value[0].shuffle();
      newsData['topnews'] = value[0].sublist(0, 10);
      newsData['india'] = value[1];
      newsData['world'] = value[2];
      newsData['business'] = value[3];
      newsData['sports'] = value[4];
      newsData['cricket'] = value[5];
      newsData['education'] = value[6];
      newsData['entertainment'] = value[7];
      newsData['lifestyle'] = value[8];
      newsData['health-fitness'] = value[9];
      newsData['books'] = value[10];
      newsData['its-viral'] = value[11];
      setState(() {
        isLoading = false;
      });
    });
  }

我也试过 Future<dynamic> rssToJson() 但仍然无法工作...任何帮助将不胜感激。提前致谢。

1 个答案:

答案 0 :(得分:0)

网络服务

import 'package:http/http.dart' as http;
import 'package:xml/xml.dart' as xml;

class NetService {
  static Future<xml.XmlDocument?> getXml(String url, {int okCode = 200}) {
    return http.get(Uri.parse(url))
      .then((response) {
        if (response.statusCode == okCode) {
          return xml.XmlDocument.parse(response.body);
        }
        PrintService.showDataNotOK(response);
        return null;
      })
      .catchError((err) => PrintService.showError(err));
  }
}

主要

import 'dart:async';
import 'dart:math';

import 'package:_samples2/networking.dart';
import 'package:xml/xml.dart' as xml;


class HindustanTimes {
  var newsFeeds = <MapEntry<String, String>>[];

  FutureOr<void> fetchRssAvailable() async {
    final url = 'https://www.hindustantimes.com/rss';
    var regExp = RegExp(r'<a title="(.+)" href="(.+)">');
    var rawPage = await NetService.getRaw(url).whenComplete(() => print('Feeds Page received.'));
    var matches = regExp.allMatches(rawPage ?? '');

    newsFeeds = matches.map((e) => MapEntry(e.group(1)!, e.group(2)!)).toList();
    print('${newsFeeds.length} feed(s) found.\n');
  }

  FutureOr<void> fetchNewsFeed({int? index}) async {
    var idx = index != null && index < newsFeeds.length 
      ? index
      : Random().nextInt(newsFeeds.length);

    await NetService.getXml(newsFeeds[idx].value)
      .then((xml.XmlDocument? document) {
        if (document != null) {
          var items = document.findAllElements('item');
          var titles = items.map((e) => e.getElement('title')!.text).toList();

          for (var i = 0; i < titles.length; i++) {
            print('[${i+1}] ${titles[i]}');
          }
        }
      })
      .whenComplete(() => print('\nNews Feed "${newsFeeds[idx].key}" received'));
  }
}

void main(List<String> args) async {
  var rss = HindustanTimes();
  await rss.fetchRssAvailable();
  await rss.fetchNewsFeed(index: 70);
  print('Done!');
}

结果:

Feeds Page received.
145 feed(s) found.

[1] Horoscope Today: Astrological prediction for March 10
[2] Horoscope Today: Astrological prediction for March 9

News Feed "Horoscope" received
Done!
相关问题