Добавление массива маркеров в Flutter_Map отображается только после перемещения карты - PullRequest
0 голосов
/ 12 января 2020

Использование Flutter_Map здесь. Я загружаю маркеры из локального файла json в моем каталоге ресурсов. Карта dr aws, маркеры загружаются в мой массив маркеров, но только до после Я перемещаю карту по экрану, чтобы показать маркеры. Я немного новичок, чтобы трепетать здесь, поэтому я, должно быть, делаю что-то не так в части загрузки маркера?

Я пробовал несколько вещей. В настоящее время это моя карта флаттера и код массива маркеров:

class _MapWidget extends StatelessWidget {
//const so flutter doesn't rebuild it each time...

  const _MapWidget();
  // final SiteID sid = null;
  // final Sites site = null;

  @override
  Widget build(BuildContext context) {
    print("add map");
    return new FlutterMap(
      options: new MapOptions(
        center: new LatLng(40.0, -120.0),
        zoom: 8.0,
      ),
      layers: [
        TileLayerOptions(
          urlTemplate:
              'https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}',
          subdomains: ['a', 'b', 'c'],
          tileProvider: CachedNetworkTileProvider(),
        ),
        new MarkerLayerOptions(markers: _MapDataState().marker),
      ],
    );
  }
}

Загрузка массива маркеров в конструкторе _MapDataState (), кажется, единственное место, где я могу получить массив для совместного использования в моем _MapWidget:

 class _MapDataState extends State<MapData> {
      List<SitesList> sl = [];
      List<SnoTelSite> sts = [];
      var marker = <Marker>[];

      _MapDataState(){
        print("map data state");
        loadSites().then((sitesdata) {
          print('Loaded Sites Asset JSON');
          //clone sitesdata into sts array
          sts..addAll(sitesdata);
          sts.forEach((s) {
            marker.add(
              Marker(
                point: new LatLng(double.parse(s.lat),double.parse(s.lng)),
                builder: (ctx) => _MarkerPopUp(sitename: s.name, siteelevation: s.elevation, siteid: s.siteID,),
              ),
            );
          });
        });
      }

      // @override
      // initState() {
      //   print("INIT STATE");
      //   super.initState();
      // }

      //local load assets ... constants hold path snotelsitesjson
      Future<String> _loadSiteAssets() async {
        return await rootBundle.loadString(snotelsitesjson);
      }

      Future loadSites() async {
        String jsonString = await _loadSiteAssets();
        final jsonResponse = json.decode(jsonString);
        SitesList sitesList = new SitesList.fromJson(jsonResponse);
        return sitesList.sites;
      }

    //main build and screen layout
      @override
      Widget build(BuildContext context) {
        print("BUILD LAYOUT");
        return MaterialApp(
          theme: ThemeData(
            primarySwatch: Colors.cyan,
          ),
          home: Scaffold(
              appBar: AppBar(
                backgroundColor: Colors.white,
                leading: Icon(Icons.ac_unit),
                title: Text("SnoTel Map"),
                actions: <Widget>[
                  IconButton(
                    icon: Icon(Icons.favorite),
                    onPressed: () {
                      debugPrint("Favorites");
                    },
                  ),
                  IconButton(
                    icon: Icon(Icons.feedback),
                    onPressed: () {
                      debugPrint("Message sent");
                    },
                  ),
                ],
              ),
              body: _MapWidget()),
        );
      }
    }

Обновление! После помощи setState () от @Ademir ниже, это работает, чтобы показать мои маркеры при загрузке:

Обновление setState ():

setState(() {
        marker = marker;
      });

Изменение _MapWidget:

    const _MapWidget({this.marker});
    final List<Marker> marker;

...

    body: _MapWidget(marker: marker)),

Ответы [ 2 ]

1 голос
/ 12 января 2020

Сначала измените это:

    _MapDataState(){
        loadSites().then((sitesdata) {
          print('Loaded Sites Asset JSON');
          //clone sitesdata into sts array
          sts..addAll(sitesdata);
          sts.forEach((s) {
            marker.add(
              Marker(
                point: new LatLng(double.parse(s.lat),double.parse(s.lng)),
                builder: (ctx) => _MarkerPopUp(sitename: s.name, siteelevation: s.elevation, siteid: s.siteID,),
              ),
            );
          });
        });
    }

из конструктора на initState():

@override
initState() {
    print("INIT STATE");
    super.initState();
    loadSites().then((sitesdata) {
          print('Loaded Sites Asset JSON');
          //clone sitesdata into sts array
          sts..addAll(sitesdata);
          sts.forEach((s) {
            marker.add(
              Marker(
                point: new LatLng(double.parse(s.lat),double.parse(s.lng)),
                builder: (ctx) => _MarkerPopUp(sitename: s.name, siteelevation: s.elevation, siteid: s.siteID,),
              ),
            );
          });
        });
}

После этого добавьте setState((){}); здесь:

          sts.forEach((s) {
            marker.add(
              Marker(
                point: new LatLng(double.parse(s.lat),double.parse(s.lng)),
                builder: (ctx) => _MarkerPopUp(sitename: s.name, siteelevation: s.elevation, siteid: s.siteID,),
              ),
            );
          });
          setState((){});
0 голосов
/ 02 мая 2020

Из любопытства, чтобы понять ваш код, что в MapData классе? а в _MarkerPopUp? Я очень новичок, чтобы трепетать, и я пытаюсь понять. Ваш полный код доступен где-нибудь? Спасибо,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...