Flutter GoogleMap Widget在我更改屏幕时创建延迟的伪影

yxyvkwin  于 2023-04-22  发布在  Flutter
关注(0)|答案(1)|浏览(97)

我有一个GoogleMap小部件夹在屏幕上的其他小部件之间。如果我导航离开,Flutter不会在新页面加载之前处理Map。这是双倍烦人的,因为我用一个英雄小部件动画了一张个人资料图片,飞越屏幕&“爵士乐”页面过渡。但是由于Map工件需要几个额外的节拍才能消失,整个过渡看起来很粗制滥造。这种情况发生在Android模拟器和Android设备上。
我尝试过使用Google和Stackoverflow来处理Map小部件的控制器,但这似乎不是一件事。
final Completer<GoogleMapController> myGoogleMapController = new Completer<GoogleMapController>();
有点时髦的控制器对吧?
如果Map小部件是全屏的话,这不会是一个问题,它只需要几个额外的节拍来改变屏幕。但它不是全屏的,它是许多小部件中的一个。
我希望谷歌Map小部件消失迅速,或至少更迅速。任何想法的perf-ing它?

cgfeq70w

cgfeq70w1#

我通过将GoogleMap小部件 Package 在一个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,然后弹出屏幕。

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

也许它成功的关键是为GoogleMap Widget提供了一个SizedBox父控件,并定义了高度。因此,当它的子控件消失时,SizedBox会将其下的每个Widget保持在适当的位置,防止Widget向下跳时主要屏幕重绘。相反,我相信Flutter只需在MapWidget的位置绘制背景即可。
额外:我在Visibility小部件上使用了一个键,以防万一。
欢迎改进。
如果GoogleMap插件开始自行处理,请立即在屏幕上退出请发布警报作为此问题的答案

相关问题