You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter集成Google Maps出现updateAcquireFence等渲染错误该如何解决?

Flutter Google Maps渲染错误解决方案:updateAcquireFence & Expecting binder but got null

问题背景

开发包含Google Maps组件的Flutter项目时,持续出现以下渲染相关警告和错误:

E/FrameEvents(10551): updateAcquireFence: Did not find frame.
W/Parcel  (10551): Expecting binder but got null!

这些错误与Google Maps组件的渲染流程直接相关。

初始实现

以下是Google Maps组件的初始实现代码:

import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';

class RecordMaps extends Stateful Widget {
  final LatLng initialLocation;

  RecordMaps({Key? key, required widget.initialLocation}) : super(key: key);

  @override
  _RecordMapsState createState() => _RecordMapsState();
}

class _RecordMapsState extends State<RecordMaps> {
  GoogleMapController? mapController;

  void _onMapCreated(GoogleMapController controller) {
    mapController = controller;
    _updateCamera();
  }

  void _updateCamera() {
    mapController?.animateCamera(CameraUpdate.newCameraPosition(
      CameraPosition(
        target: widget.initialLocation,
        zoom: 15.0,
      ),
    ));
  }

  @override
  Widget build(BuildContext context) {
    return GoogleMap(
      onMapCreated: _onMapCreated,
      initialCameraPosition: CameraPosition(
        target: widget.initialLocation,
        zoom: 15.0,
      ),
      myLocationEnabled: true,
      myLocationButtonEnabled: true,
    );
  }

  @override
  void dispose() {
    mapController?.dispose();
    super.dispose();
  }
}

解决方案:启用Hybrid Composition

经过排查,为Google Maps组件启用Hybrid Composition可解决上述问题。该机制通过调用平台原生视图进行渲染,能修复包括此类问题在内的多种渲染异常。

以下是启用Hybrid Composition后的更新代码:

import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart';
import 'package:google_maps_flutter_android/google_maps_flutter_android.dart';

class RecordMaps extends Stateful Widget {
  final LatLng initialLocation;

  RecordMaps({Key? key, required widget.initialLocation}) : super(key: key);

  @override
  _RecordMapsState createState() => _RecordMapsState();
}

class _RecordMapsState extends State<RecordMaps> {
  GoogleMapController? mapController;

  @override
  void initState() {
    super.initState();
    _initializeMapRenderer();
  }

  void _initializeMapRenderer() {
    final GoogleMapsFlutterPlatform mapsImplementation = GoogleMapsFlutterPlatform.instance;
    if (mapsImplementation is GoogleMapsFlutterAndroid) {
      mapsImplementation.useAndroidViewSurface = true;
    }
  }

  void _onMapCreated(GoogleMapController controller) {
    mapController = controller;
    _updateCamera();
  }

  void _updateCamera() {
    mapController?.animateCamera(CameraUpdate.newCameraPosition(
      CameraPosition(
        target: widget.initialLocation,
        zoom: 15.0,
      ),
    ));
  }

  @override
  void dispose() {
    mapController?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        height: MediaQuery.of(context).size.height,
        width: MediaQuery.of(context).size.width,
        child: GoogleMap(
          onMapCreated: _onMapCreated,
          initialCameraPosition: CameraPosition(
            target: widget.initialLocation,
            zoom: 15.0,
          ),
          myLocationEnabled: true,
          myLocationButtonEnabled: true,
          mapType: MapType.normal, // 使用普通地图类型
          zoomControlsEnabled: false, // 禁用缩放控件(按需调整)
          compassEnabled: false, // 禁用指南针(按需调整)
        ),
      ),
    );
  }
}

原理说明

在initState方法中新增_initializeMapRenderer函数,将useAndroidViewSurface设置为true,以此为Android平台的Google Maps组件启用Hybrid Composition,核心代码如下:

void _initializeMapRenderer() {
  final GoogleMapsFlutterPlatform mapsImplementation = GoogleMapsFlutterPlatform.instance;
  if (mapsImplementation is GoogleMapsFlutterAndroid) {
    mapsImplementation.useAndroidViewSurface = true;
  }
}

启用该设置后,updateAcquireFence和Expecting binder but got null错误得以解决,地图性能更流畅且无渲染警告。

总结

若你的Flutter应用中Google Maps组件出现类似渲染错误,可尝试通过设置useAndroidViewSurface启用Hybrid Composition,该操作能显著提升渲染性能并消除相关错误警告。

内容的提问来源于stack exchange,提问作者Vinicius Dreher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:55:58