1

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

下面的代码在对话框被激活的那一刻完成了这一点,但是当用户移动时我没有成功刷新距离。我怀疑它涉及在 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();
            },
          ),
        ],
      );
    });

}

4

1 回答 1

0

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

根据您的要求,使用定位服务可以很快耗尽用户的电池 - 所以我还包括了 5 秒的间隔时间。

另外,是的,您确实需要使用向对话框添加状态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();
                }
              });
        });
      });
}
于 2021-04-26T02:54:01.410 回答