错误消息:未处理的异常:类型“_InternalLinkedHashMap”类型的子类型
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()
但仍然无法工作...任何帮助将不胜感激。提前致谢。
答案 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!