Flutter未完成获取请求

时间:2019-09-16 20:51:39

标签: http asynchronous flutter dart

我正在做Flutter应用程序,但是当我想发出一些HTTP请求时发现了一个问题。问题是,当我要创建该函数时,我将函数定义为异步函数,并在调用函数http.get()之前编写了await,但是该函数未执行且该函数之后的代码也未执行。 代码在下面,并且不会引发任何错误。

import lxml
import lxml.etree as ET

for rra in rrd:
    for database in rra:
        for node in database:
            if isinstance(node, lxml.etree._Comment):
                print(node.text.strip())

2019-05-19 13:15:15 CDT / 1558289715
2019-05-19 13:15:30 CDT / 1558289730
2019-05-19 13:15:45 CDT / 1558289745

class db{

  void get_basic() async{
    String url = 'http://example.org/';
    Response response = await get(url);
    int statusCode = response.statusCode;
    print("Listo");
    print(statusCode);
  }
}

1 个答案:

答案 0 :(得分:0)

async函数总是返回未来。

  

Future对象表示其返回值可能尚不可用的计算。当将来某个时候完成时,Future返回计算的值。期货通常用于潜在的冗长计算,例如I / O和与用户的交互。

async函数将返回期货,这意味着它们将在将来执行。 因为dart使用单个线程来运行代码,这意味着当它到达await而不是阻塞线程时,它将在函数调用后移至该线程并再次开始激活代码直到其空闲为止。 当线程完成所有同步代码后,它将返回到await 线,在那里开始兴奋。

构建完成后应调用get_basic()代码。 如果您想在get_basic()完成后重建小部件,则需要使用FutureBuilder

class _MyHomePageState extends State<MyHomePage> {

  db database;

  @override
  void initState() {
    super.initState();
    database = db();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
        title: Text('Title'),
    ),
    body: FutureBuilder(
      future: database.get_basic(),
      builder: (context,snapshot){
        if(snapshot.connectionState!=ConnectionState.done){
          return Center(
            child: Text('Loading...'),
          );
        } else {
          if(snapshot.hasError){
            return Center(
              child: Text(snapshot.error.toString()),
            );
          }
          return ListView.builder(
            itemCount: snapshot.data.length,
            itemBuilder: (context, index){
              return ListTile(title: Text(snapshot.data[index]['title']),);
            },
          );
        }
      },
    ),
    );
  }
}

class db{

  Future get_basic() async{
    try {
      String url = 'https://jsonplaceholder.typicode.com/posts';
      Response response = await get(url);
      return jsonDecode(response.body);
    } catch (e) {
      print(e);
      return [{}];
    }
  }
}