Как создать диалоговое окно, которое автоматически обновляет текущее расстояние до фиксированной позиции?

Я пытаюсь создать общую функцию флаттера, которая представляет собой диалоговое окно, которое автоматически обновляет текущее расстояние до фиксированного положения? Когда диалоговое окно активно, оно отображает расстояние (в метрах) от текущего положения до фиксированного положения (цели) и автоматически обновляется при изменении местоположения.

Приведенный ниже код выполняет это на момент активации диалогового окна, но мне не удалось обновить расстояние при перемещении пользователя. У меня есть подозрение, что это связано с добавлением StatefulBuilder в showDialog, но я не нашел решения.

Спасибо заранее за любую помощь.

      _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();
            },
          ),
        ],
      );
    });

}

1 ответ

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();
                }
              });
        });
      });
}
Другие вопросы по тегам