【问题标题】:Get request is not done with Flutter使用 Flutter 未完成获取请求
【发布时间】:2019-09-16 20:51:39
【问题描述】:

我正在做一个 Flutter 应用程序,但是当我想发出一些 http 请求时,我发现了一个问题。问题是,当我想做它时,我将函数定义为异步,我在调用函数http.get()之前写了await,但是它没有执行的函数并且函数之后的代码也没有执行. 代码如下,没有报错。

class db{

  void get_basic() async{
    String url = 'http://example.org/';
    Response response = await get(url);
    int statusCode = response.statusCode;
    print("Listo");
    print(statusCode);
  }
}
Widget build(BuildContext context){
    print("inicio database");
    db database = db();
    database.get_basic();
    print("final database");
    main_content main = main_content();
    return Scaffold(
      appBar: AppBar(
        title: Text('Title),
      ),
      body: main,
      bottomNavigationBar: bottomNavBar(0,main.refresh),
    );
  }

【问题讨论】:

  • 您在标题文本中缺少结束引号

标签: http asynchronous flutter dart


【解决方案1】:

async 函数总是返回一个未来。

Future 对象表示其返回值可能尚不可用的计算。 Future 在未来某个时间完成时返回计算的值。 Futures 通常用于可能冗长的计算,例如 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 [{}];
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 2020-06-18
    相关资源
    最近更新 更多