Получение потока позиции из Geolocator в флаттер StreamBuilder - PullRequest
0 голосов
/ 14 февраля 2020

Я только начинаю с Flutter и очень плохо знаком с концепциями State / Stream / Blo C. Я пытаюсь обновить FlutterMap центр на основе координат из потока Geolocator() Position. В данный момент я просто вызываю setState(), обновляя переменную новым значением, но затем я попытаюсь использовать шаблон Blo c вместо этого. Теперь, как и я, устанавливаю центр по координатам Положение, исходящее из потока, я также установил Marker по тем же координатам. Я ожидал увидеть маркер Steady в центре экрана и движущуюся карту внизу, но наоборот ... Карта устойчива, а значок движется ... Вы видите, где я ошибся? Кроме того, для свойства stream: StreamBuilder как мне передать поток из Geolocator() как событие?

Большое спасибо за ваше время и помощь.

Это Поток:

StreamSubscription positionStream = _geolocator
        .getPositionStream(locationOptions)
        .listen((Position position) {
      setState(() {
        _position = position;
      });
      print(
          _position.latitude.toString() + ',' + _position.longitude.toString()); // ok
    });

А это Карта и Маркер:

Container(
                height: 670,
                width: 370,
                child: FlutterMap(
                  options: MapOptions(
                    center: LatLng(_position.latitude, _position.longitude),
                    minZoom: 16.0,
                    maxZoom: 19.0,
                  ),
                  layers: [
                    TileLayerOptions(
//                        urlTemplate:
//                        'https://api.openrouteservice.org/mapsurfer/{z}/{x}/{y}.png?api_key=omitted',
                        urlTemplate:
                            'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
                        subdomains: ['a', 'b', 'c'],
                        keepBuffer: 20),
                    new MarkerLayerOptions(
                      markers: [
                        new Marker(
                            point: new LatLng(
                                _position.latitude, _position.longitude),
                            height: 200,
                            width: 200,
                            builder: (context) => IconButton(
                                  icon: Icon(Icons.location_on),
                                  color: Colors.red,
                                  iconSize: 60,
                                  onPressed: () {
                                    print('icon tapped');
                                  },
                                )),
                      ],
                    ),
                  ],
                ),
              ),

1 Ответ

0 голосов
/ 14 февраля 2020

Нашел проблему. Я не назначил никаких MapController(). Поэтому я создал один и назначил его на FlutterMap. Внутри setState() я добавил _controller.move(LatLng(_position.latitude, _position.longitude), 16.0);, и теперь поведение является ожидаемым. Постоянный значок в центре экрана и движущаяся карта внизу. Надеюсь, что это поможет другим. Но все же я постараюсь добиться того же с паттерном BLo C. Приветствия

...