在Google地图上重新热加载之前,标记不会显示

白熊

我将标记添加到googlemap。

在此代码中。第一次加载时,没有标记

当我推动r热装时,出现标记

我只是猜测,我可能必须在这里做些什么???

setState((){
  print("items ready and set state");
});

我该如何解决?

class _MapPageState extends State<MapPage> {

  Completer<gmap.GoogleMapController> _controller = Completer();

  Set<gmap.Marker> _markers = {};


  @override
  void initState(){
    super.initState();
    _asyncMethod();
    print("init ready");
  }

  _asyncMethod() async {
    _markers = {};

    print ("asyncMethod start");
    
    List<dynamic> wayLabels = annotModel['wayLabel'];
    wayLabels.forEach((x){
      gmap.BitmapDescriptor icon;
      gmap.BitmapDescriptor.fromAssetImage(
        ImageConfiguration(devicePixelRatio: 2.5),
            x['image'][CommonFunc.langKey]).then((onValue) {
            icon = onValue;
            gmap.Marker marker = gmap.Marker(
              markerId: gmap.MarkerId(x['title']),
              position: gmap.LatLng(x['latitude'],x['longitude']),
              icon: icon
            );
            _markers.add(marker);
        });
    });
    
    setState((){
      print("items ready and set state");
    });
  }
  Widget makeMyMap(){
    gmap.GoogleMap myMap = gmap.GoogleMap(
      mapType: gmap.MapType.normal,
      markers : _markers,
      initialCameraPosition: _kGooglePlex,
      onMapCreated: (gmap.GoogleMapController controller) {
        _controller.complete(controller);
      }
    );
    return Container(child:myMap);
  }

  @override
  Widget build(BuildContext context){
    return 
      Column(children: <Widget>[
          Expanded(child:Stack(children: <Widget>[
            makeMyMap(),
          ]),),
      ]);
  }
}

gmap.BitmapDescriptor.fromAssetImage 可能需要一些时间,所以

    setState((){
      print("items ready and set state");
    });

_asyncMethod()

在设置所有标记之前被调用。

那就是问题所在。


解。

更改 _markers.add(marker);

setState((){
  _markers = markers;
  print("items ready and set state");
});

它运作良好。

阿兰戈亚麻

您应该尝试使用此软件包https://pub.dev/packages/after_layout在afterFirstLayout方法内调用_asyncMethod

@override
  void afterFirstLayout(BuildContext context) {
    // Calling the same function "after layout" to resolve the issue.
    _asyncMethod();
  }

另外,我认为将_asyncMethod中的标记分配给局部变量更健康,然后在setState中更改标记

_asyncMethod() async {
    var localMarkers = {};

    .
    .
    .
    
    setState((){
        _markers = localMarkers;
    });
  }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章