如何在initState中等待异步

时间:2019-11-25 13:54:32

标签: flutter

我有一个需要在有状态窗口小部件的initState中调用的异步函数,但是我不能使用await,因为initState不是异步的。

sendHealthDataasync,因为它从Health Api获取了一些信息,然后我需要将该信息发送到另一个StatefulWidget的HomeSubScreen。但是在创建HomeSubScreen时,sendHealthData方法无法获取所有信息,因此,如果我尝试将参数值发送给HomeSubScreen,则该值将为null。 / p>

我该怎么做?

@override
  void initState() {
    super.initState();
    sendHealthData();
    _widgetOptions = <Widget>[
      HomeSubScreen(healthData),
    ];

  }

更新: 如果添加了then(),则会出现以下错误:

NoSuchMethodError: The method 'elementAt' was called on null.

代码已更新:

@override
      void initState() {
        super.initState();
        sendHealthData().then((response){
             _widgetOptions = <Widget>[
                 HomeSubScreen(healthData),
              ];
        });


      }

3 个答案:

答案 0 :(得分:1)

我给你大概的想法。

@override
void initState() {
  super.initState();

  function().then((int value) {
    // future is completed you can perform your task 
  });

  function2(); // or you can simply call the method if you don't want anything to do after future completes
}

Future<int> function() async {
  // do something here 
}

Future<int> function2() async {
  // do something here
}

答案 1 :(得分:0)

您不能在initState中等待异步功能,但是一个小技巧是在以后完成操作后使用Then关键字执行代码。

例如:

@override


void initState() {
    super.initState();
    sendHealthData().then((response){

      _widgetOptions = <Widget>[
        HomeSubScreen(response),
      ];

    });


  }

,函数必须类似于:

Future sendHealthData() async{}

答案 2 :(得分:0)

您也可以使用FutureBuilder

FutureBuilder<String>(
  future: getYourDataFromApi(), 
  builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
    switch (snapshot.connectionState) {
      case ConnectionState.none:
        return Text('start widget');
      case ConnectionState.active:
      case ConnectionState.waiting:
        return Text('Awaiting result from api...');
      case ConnectionState.done:
        if (snapshot.hasError)
          return Text('Error: ${snapshot.error}');
        return Text('Result: ${snapshot.data}');
    }
    return null; // unreachable
  },
)