飞镖检查未完成的将来

时间:2020-10-07 18:32:43

标签: flutter dart

我想检查Future<dynamic>在500毫秒后是否尚未完成。

RaisedButton(
  onPressed: () async {

    setState(() {
      isLoading = true;
    });

    dynamic responseBody;

    Future.delayed(Duration(milliseconds: 500), () {
      print(responseBody == null); // always false, so it never null, even uncompleted
      // if (responseBody != null) {
      //   isLoading = false;
      // }
    });

    NetworkHelper n = NetworkHelper(queryFinalUrl);
    responseBody = await n.getData();
  },
)
import 'package:http/http.dart' as http;
import 'dart:convert';

class NetworkHelper {
  NetworkHelper(this.url);

  final String url;
  Future getData() async {
    http.Response response = await http.get(this.url);

    String responseBody = response.body;
    return jsonDecode(responseBody);
  }
}

我试图检查我的dynamicnullresponseBody == null,但似乎从来没有null

更新以获取详细信息:

好的,我有一个加载指示器/加载微调器,它将使用Visibility()覆盖全屏,一旦按下按钮,就需要显示它。因此,您可能会注意到代码isLoading是可见性bool。所以我的想法是,一旦按下按钮,我想立即添加另一个计时器Future.delayed,因此计数为500毫秒,如果:

  1. 500毫秒已完成,并且尚未收到responseBody,请继续显示加载指示器

  2. 500毫秒已完成,responseBody已完成,请取消加载指示器

假设responseBody在400毫秒内完成,“ Loading”指示符必须再保留100ms才能被清除

我希望这个细节对您清楚。 :)很抱歉给您带来不便。

是的,我知道我在等待获取网络数据时需要放置await

我通过setState()显示加载指示器

总而言之,这就是为什么我要检查Future<dynamic>是完成还是未完成

1 个答案:

答案 0 :(得分:0)

您进行的responseBody == null检查永远不会成功,因为您这样做:

responseBody = n.getData();

,它无条件地为responseBody分配了Future。因此,responseBody将始终被分配一个Future,无论它是否完整。您可以这样做:

responseBody = await n.getData();

,仅在responseBody完成后,才会为Future分配Future

或者,您可以使用Future.timeout

NetworkHelper n = NetworkHelper(queryFinalUrl);
try {
  dynamic responseBody = await n.getData().timeout(Duration(milliseconds: 100));
  ...
} on TimeoutException {
  isLoading = false;
}