从未来对象返回字符串

时间:2019-11-28 07:29:15

标签: string asynchronous dart future

我正在尝试通过localproxy提取html页面以进行解析并从中获取网址。没有Dart中的Future,我找不到任何可用的库。所以我很难从Future对象返回String。以下是dart文件的完整代码。

import 'package:universal_html/driver.dart';
import 'package:universal_html/prefer_universal/html.dart';

String proxyUrl='http://localhost/php-proxy/index.php?q=';
String hallTicketUrl='http://www.ignou.ac.in/ignou/studentzone/results/6';

Future<String> getList()async{
  final driver = HtmlDriver();
  await driver.setDocumentFromUri(Uri.parse(proxyUrl+hallTicketUrl));
  final items = driver.document.querySelectorAll('.middleconten2column a');

  Element urls=Element.tag('urls');
  items.forEach((item)=>urls.append(Element.tag('url')
                        ..setAttribute('href',item.getAttribute('href'))
                        ..text=item.text
                        )
        );
  print('${items.length} items found');

return Future.value(urls.outerHtml);
}

String Handler(String app){
    switch(app){
       case 'list': return getList() as String;
}
return "";
}

main(){
    print(Handler('list'));
}

1 个答案:

答案 0 :(得分:0)

我认为您误解了async关键字对方法的作用。当方法标记为async时,它将始终自动返回某物的未来。这就是为什么您需要指定例如Future<String>作为返回类型。

但是,由于创建是“自动”完成的,因此您实际上不需要执行以下操作:

return Future.value(urls.outerHtml);

但是可以这样做:

return urls.outerHtml;

此后,您发现了使用异步编程的问题,因为您的代码中有async,因此调用堆栈中的所有内容都必须标记为await

我已经修复了您的代码,现在希望它可以在以后的所有工作中正常使用

import 'package:universal_html/driver.dart';
import 'package:universal_html/prefer_universal/html.dart';

String proxyUrl = 'http://localhost/php-proxy/index.php?q=';
String hallTicketUrl = 'http://www.ignou.ac.in/ignou/studentzone/results/6';

Future<String> getList() async {
  final driver = HtmlDriver();
  await driver.setDocumentFromUri(Uri.parse(proxyUrl + hallTicketUrl));
  final items = driver.document.querySelectorAll('.middleconten2column a');

  Element urls = Element.tag('urls');
  items.forEach((item) => urls.append(Element.tag('url')
    ..setAttribute('href', item.getAttribute('href'))
    ..text = item.text));
  print('${items.length} items found');

  return urls.outerHtml;
}

Future<String> Handler(String app) async {
  switch (app) {
    case 'list':
      return await getList();
  }
  return "";
}

main() async {
  print(await Handler('list'));
}