[英]Implementing async / await in Dart/Flutter
为什么构建方法在重新启动时显示“NULL”,但在热重载时更新纬度值?
是否可以将 Text('Lat: $latitude') 加载为 initState() 本身?
class _LoadingScreenState extends State<LoadingScreen> {
double latitude;
double longitude;
@override
void initState() {
super.initState();
getLocation();
}
void getLocation() async {
Location location = Location();
await location.getCurrentLocation();
latitude = location.latitude;
longitude = location.longitude;
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(child: Text('Lat: $latitude')),
);
}
}
那是因为您在更改数据时没有调用setState
方法,因此小部件没有自行重建。
应该是这样的:
void getLocation() async {
Location location = Location();
await location.getCurrentLocation();
setState(() {
latitude = location.latitude;
longitude = location.longitude;
});
}
当构建方法构建小部件时, latitude
没有时间被分配一个值。
使用 setState 方法包装纬度和经度的分配,以通知框架应该进行新的构建。 这样,纬度值将在可用时立即更新。
setState(() {
latitude = location.latitude;
longitude = location.longitude;
});
提示是在等待分配时显示其他内容而不是latitude
值。 例如,这可以是 CircularProgressIndicator。
与上面的答案一样,getLocation 是异步的,这意味着它将在未来完成,在重新启动时,您将获得当前的纬度,该纬度为空,然后因为它还没有获得该值,当热重新加载时,您将显示该值,然后是已经完成,您可以在上面的有状态类中使用 setState ,或者您可以使用 futurebuilder 在可用时显示值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.