授予权限时重新加载“我的位置”按钮

Reload My Location button when permission is granted

提问人:cj- 提问时间:12/8/2019 最后编辑:cj- 更新时间:8/18/2020 访问量:1045

问:

背景

我正在使用 google_maps_flutter 包来显示带有与房屋相对应的标记的地图。为了避免设备过载,我只在用户正在查看的位置附近装载房屋。为了方便起见,我请求用户的位置并将其提供给 Google 地图,以便显示“我的位置”按钮。

问题

如果已授予位置访问权限,则它将按预期工作。如果地图已加载,则不会显示“我的位置”按钮。

目前,如果在地图上显示时授予了位置权限,我只需将相机移动到他们的位置即可。这是一个不错的解决方法,但我宁愿让用户决定在哪里查看。

在地图已加载的情况下授予权限时,如何加载按钮?

  1. 我试过只设置状态。
  2. 手动将地图标记为脏。
  3. 使用测试方法强制地图重新加载选项。

我已经检查了我可以访问的所有可用方法,所以在这一点上,我怀疑是否有任何其他选择。如果是这种情况,我会将其报告为错误。

我的代码

  @override
  Widget build(BuildContext context) {
    // Load markers when permission is granted.
    location.hasPermission().then((currPerm) async {
      if (!currPerm) {
        bool newPerm = await location.requestPermission();
        if (newPerm) {
          LocationData data = await location.getLocation();
          (await mapController.future).moveCamera(CameraUpdate.newLatLng(LatLng(data.latitude, data.longitude)));
        }
      }
    });

    GoogleMap map = GoogleMap(
      initialCameraPosition: CameraPosition(
        target: INIT_POS,
        zoom: 11.5,
      ),
      myLocationEnabled: true,
      myLocationButtonEnabled: true,
      trafficEnabled: true,
      markers: markers,
      onMapCreated: (newController) => mapController.complete(newController),
      onCameraIdle: () async {
        // Load markers when the camera stops moving.
        LatLngBounds bounds = await (await mapController.future).getVisibleRegion();
        loadMarkers(
          LatLng(
            (bounds.northeast.latitude + bounds.southwest.latitude)/2,
            (bounds.northeast.longitude + bounds.southwest.longitude)/2
          ),
        );
      },
    );
    return map;
  }
谷歌地图 颤动

评论

0赞 Nicolas Caous 12/8/2019
没有代码,没有人可以回答你:'(请提供你正在谈论的代码。
0赞 cj- 12/8/2019
给你。我希望这就足够了。如果需要,我绝对可以添加额外的上下文。
0赞 Nicolas Caous 12/9/2019
我认为这实际上是一个错误。没有理由不工作。
0赞 Nicolas Caous 12/9/2019
为什么不触发 moveCamera,而不管它是否是用户第一次授予权限?
0赞 Nicolas Caous 12/9/2019
也许这就是呈现您想要的按钮的原因

答:

7赞 maganap 2/16/2020 #1

截至 ,我通过将变量分配给 来解决它,并在获得位置权限后更改其值。如果你硬编码,它就是行不通的。google_maps_flutter: ^0.5.23+1myLocationEnabledtrue

GoogleMap map = GoogleMap(
      myLocationEnabled: _isLocationGranted,
      ...

所以,最初是.当我获得位置权限时,我将其设置为并重建小部件(通过调用、触发或您使用的任何方法)。_isLocationGrantedfalsetruesetState()BlocBuilder()

另一个相关参数 ,似乎不需要这种处理。myLocationButtonEnabled: true

评论

1赞 LucaT 8/27/2021
我也有同样的问题,你能举个例子说明你是怎么做的吗?