getPackages function
Implementation
Future<List<DartPackageInfo>> getPackages(String query) async {
final responses = await Future.wait([1, 2].map((page) => http.get(Uri.parse(
'https://pub.dev/packages?page=$page&q=${Uri.encodeComponent(query)}'))));
return responses.expand((e) {
var found = Document.html(e.body);
final packages = found.getElementsByClassName('packages-item');
String? getText(Element source, String className) {
final found = source.getElementsByClassName(className);
if (found.isNotEmpty) {
return found.first.text;
} else {
return null;
}
}
return packages.map((e) {
String? author;
String? recentVersion;
e.getElementsByClassName('packages-metadata').forEach((element) {
var link = element.getElementsByTagName('a').forEach((a) {
var href = a.attributes['href'];
if (href != null) {
if (href.startsWith('/packages')) {
/// This is the version number
try {
recentVersion = Version.parse(a.text).toString();
} catch (e) {}
} else if (href.startsWith('/publishers')) {
author = a.text;
}
}
});
});
return DartPackageInfo(
name: getText(e, 'packages-title'),
description: getText(e, 'packages-description'),
author: author,
recentVersion: recentVersion,
likes: int.tryParse(getText(e, 'packages-score-value-number') ?? '0'),
platforms: [],
);
}).where((element) =>
element.name != null &&
element.name!.toLowerCase().contains(query.toLowerCase()));
}).toList();
}