我想检查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);
}
}
我试图检查我的dynamic
是null
和responseBody == null
,但似乎从来没有null
。
更新以获取详细信息:
好的,我有一个加载指示器/加载微调器,它将使用Visibility()
覆盖全屏,一旦按下按钮,就需要显示它。因此,您可能会注意到代码isLoading
是可见性bool
。所以我的想法是,一旦按下按钮,我想立即添加另一个计时器Future.delayed
,因此计数为500毫秒,如果:
500毫秒已完成,并且尚未收到responseBody
,请继续显示加载指示器
500毫秒已完成,responseBody
已完成,请取消加载指示器
假设responseBody
在400毫秒内完成,“ Loading”指示符必须再保留100ms才能被清除
我希望这个细节对您清楚。 :)很抱歉给您带来不便。
是的,我知道我在等待获取网络数据时需要放置await
我通过setState()
显示加载指示器
总而言之,这就是为什么我要检查Future<dynamic>
是完成还是未完成
答案 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;
}