У меня есть простой сервис, который отслеживает текущую позицию пользователя:
class LocationService {
LatLng _lastLocation;
Location location = Location();
StreamController<LatLng> _locationController = StreamController<LatLng>();
Stream<LatLng> get locationStream => _locationController.stream;
LocationService() {
location.onLocationChanged().listen((locationData) {
LatLng location = LatLng(locationData.latitude, locationData.longitude);
if(_lastLocation == null || _lastLocation != location) {
_lastLocation = location;
_locationController.add(location);
}
});
}
}
Затем я использую этот сервис для создания карты (благодаря flutter_map ), котораяследуя текущей позиции пользователя:
class SelfUpdatingMap extends StatelessWidget {
final Icon currentPositionIcon;
final MapController _controller = MapController();
SelfUpdatingMap({
this.currentPositionIcon,
});
@override
Widget build(BuildContext context) => StreamBuilder<LatLng>(
stream: LocationService().locationStream,
builder: (context, asyncSnapshot) {
if (asyncSnapshot.hasError || asyncSnapshot.data == null) {
return Text('Loading...');
}
try {
_controller?.move(asyncSnapshot.data, 18);
} catch (ignored) {}
return _createMapWidget(context, asyncSnapshot.data);
},
);
Widget _createMapWidget(BuildContext context, LatLng location) => FlutterMap(
options: MapOptions(
center: location,
zoom: 18,
),
layers: [
TileLayerOptions(
urlTemplate: 'https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png', // https://a.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png is good too.
subdomains: ['a', 'b', 'c'],
),
MarkerLayerOptions(
markers: [
Marker(
width: 40,
height: 40,
point: location,
builder: (contact) => currentPositionIcon,
),
]
),
],
mapController: _controller,
);
}
Затем я использую виджет SelfUpdating
в двух местах:
- page 1 , предок стр. 2 .
- А на стр. 3 , преемнике стр. 2 .
Итак, вотситуация:
- Я запускаю свое приложение, я на странице 1 .У меня есть
SelfUpdatingMap
. - Я звоню
Navigator.pushNamed(context, '/page-2')
. - Я звоню
Navigator.pushNamed(context, '/page-3')
.У меня есть еще один SelfUpdatingMap
. - Я звоню два раза
Navigator.pop(context)
, я получаю page 1 НО SelfUpdatingMap
больше не обновляется.
Строителя даже больше не вызывают.Так что, пожалуйста, что не так с этим кодом?
Спасибо!