StreamBuilder не перестраивается после Navigator.pop - PullRequest
0 голосов
/ 20 июня 2019

У меня есть простой сервис, который отслеживает текущую позицию пользователя:

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. Я запускаю свое приложение, я на странице 1 .У меня есть SelfUpdatingMap.
  2. Я звоню Navigator.pushNamed(context, '/page-2').
  3. Я звоню Navigator.pushNamed(context, '/page-3').У меня есть еще один SelfUpdatingMap.
  4. Я звоню два раза Navigator.pop(context), я получаю page 1 НО SelfUpdatingMap больше не обновляется.

Строителя даже больше не вызывают.Так что, пожалуйста, что не так с этим кодом?

Спасибо!

...