【问题标题】:Markers are not shown before Hot reload on the google map, flutter在谷歌地图上热重载之前不显示标记,颤动
【发布时间】:2020-12-02 12:28:54
【问题描述】:

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

效果很好。

【问题讨论】:

    标签: flutter dart


    【解决方案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;
        });
      }
    

    【讨论】:

    • 非常感谢,我正在尝试后一种方式。但发现async 中的最终 setState() 方法在每个过程完成之前被调用。
    • o 是的,测试您可以使用已安装的属性api.flutter.dev/flutter/widgets/State/mounted.html
    • 感谢您的第二个想法,使用局部变量是最好的方法。还有另一个问题是 setState*() 在gmap.BitmapDescriptor.fromAssetImage 完成之前被调用。然而它被解决了。我添加到我的文章中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 2014-10-08
    相关资源
    最近更新 更多