问题描述
我正在尝试创建一个通用的颤振函数,该函数会显示一个对话框,该对话框会自动刷新到固定位置的当前距离?当对话框处于活动状态时,它将显示从当前位置到固定位置(目标)的距离(以米为单位)并随着位置的变化自动更新。
下面的代码在对话框被激活的瞬间完成了这一点,但我没有成功地在用户移动时刷新距离。我怀疑它涉及在 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();
}
});
});
});
}