Flutter GoogleMap Widget 在我更换屏幕时创建挥之不去的伪像

问题描述 投票:0回答:1

我有一个 GoogleMap 小部件夹在屏幕上的其他小部件之间。如果我导航离开,Flutter 不会在新页面加载之前处理掉地图。这很烦人,因为我用英雄小部件制作了个人资料图片动画,飞过屏幕并“爵士乐”页面转换。但是随着 Map 工件花费一些额外的节拍来消失,整个过渡看起来很粗糙。这在 Android 模拟器和 Android 设备上都会发生。

我已经尝试使用谷歌搜索和 Stackoverflow 来处理地图小部件的控制器,但这似乎不是一回事。

final Completer<GoogleMapController> myGoogleMapController = new Completer<GoogleMapController>();

有点时髦的控制器吧?

如果地图小部件是全屏的,这将不是问题,只是需要一些额外的节拍来改变屏幕。但它不是全屏,它是众多小部件中的一个。

我希望 Google 地图小部件能够迅速消失,或者至少更迅速地消失。 有什么想法吗?

flutter google-maps controller dispose
1个回答
0
投票

我通过将 GoogleMap 小部件包装在 Visibility 小部件中解决了这个问题。

SizedBox(
          width: double.infinity,
          height: 300,
          child: Visibility(
            visible: screenOpen, child:
            GoogleMap(
            myLocationEnabled: true,
            mapType: MapType.normal,
            initialCameraPosition: CameraPosition(
              target: LatLng(widget.job.latitude!, widget.job.longitude!),
              zoom: 14.8,
            ),
            onMapCreated: _onMapCreated,
            circles: circles!,
          ))),

screenOpen 是一个类变量:

bool screenOpen = true;

当用户想要弹出屏幕时,我先翻转 Visibility 的 visible bool,然后弹出屏幕。

也许它成功的关键是给 Map Widget 一个 SizedBox parent,定义了高度。因此,当它的子项消失时,SizedBox 会将其下方的每个 Widget 保持在适当的位置,并防止主屏幕重绘,因为 widgets 向下跳跃。相反,我相信 Flutter 只需在地图小部件所在的位置绘制背景即可。

所以...

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
        onWillPop: () async {
          setState(() {
            screenOpen = false;
          });
          Navigator.of(context).pop(widget.job);
          return true;
    },
    child: Scaffold(

这似乎有效。我在可见性小部件上使用了一个键,以防万一。 我还在每次调用

screenOpen = true;
时设置
initState()

欢迎改进。

如果 GoogleMap 插件开始自行处理并立即在屏幕上退出请发布警报作为此问题的答案.

© www.soinside.com 2019 - 2024. All rights reserved.