如何创建自动刷新当前到固定位置的距离的对话框?

问题描述

我正在尝试创建一个通用的颤振函数,该函数会显示一个对话框,该对话框会自动刷新到固定位置的当前距离?当对话框处于活动状态时,它将显示从当前位置到固定位置(目标)的距离(以米为单位)并随着位置的变化自动更新。

下面的代码在对话框被激活的瞬间完成了这一点,但我没有成功地在用户移动时刷新距离。我怀疑它涉及在 showDialog 中添加 StatefulBuilder,但还没有找到解决方案。

在此先感谢您的帮助。

_displayTargetDistance(BuildContext context,Position theTarget) async {
Geolocator geolocator = Geolocator();
geolocator.forceAndroidLocationManager;
Position position =  await geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.best);
double distanceInMeters = await Geolocator().distanceBetween(theTarget.latitude,theTarget.longitude,position.latitude,position.longitude);
String str = distanceInMeters.toString() + " Meters";
return showDialog(
    context: context,builder: (context) {
      return AlertDialog(
        title: Text('Distance to Target'),content: Text(str),actions: <Widget>[
          new FlatButton(
            child: new Text('OK'),onPressed: () {
              Navigator.of(context).pop();
            },),],);
    });

}

解决方法

geolocator 有一个内置的流。我已经在下面的示例中构建了。

根据您的要求,使用位置服务会很快耗尽用户的电量 - 因此我还包括了 5 秒的 intervalDuration。

另外,是的,您确实需要使用 StatefulBuilder

向对话框添加状态
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';

_displayTargetDistance(BuildContext context,Position theTarget) async {
  Stream<Position> positionStream = Geolocator.getPositionStream(forceAndroidLocationManager: true,intervalDuration: Duration(seconds: 5));
  return showDialog(
      context: context,builder: (context) {
        return StatefulBuilder(
            builder: (BuildContext context,StateSetter setState) {
          return StreamBuilder<Position?>(
              stream: positionStream,builder: (context,snapshot) {
                if (snapshot.hasData) {
                  Position currentPosition = snapshot.data!;
                    double distanceInMeters = Geolocator.distanceBetween(theTarget.latitude,theTarget.longitude,currentPosition.latitude,currentPosition.longitude);
                    String str = distanceInMeters.toString() + " Meters";
                  return AlertDialog(
                    title: Text('Distance to Target'),content: Text(str),actions: <Widget>[
                      new FlatButton(
                        child: new Text('OK'),onPressed: () {
                          Navigator.of(context).pop();
                        },),],);
                } else {
                  return Container();
                }
              });
        });
      });
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...