繁体   English   中英

在 Dart/Flutter 中实现 async/await

[英]Implementing async / await in Dart/Flutter

  1. 为什么构建方法在重新启动时显示“NULL”,但在热重载时更新纬度值?

  2. 是否可以将 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM