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

时间:2020-08-12 17:34:25

标签: flutter dart

我将标记添加到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");
});

效果很好。

1 个答案:

答案 0 :(得分:1)

您应该尝试使用此软件包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;
    });
  }