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

如何在WidgetTest中让moveCamera调用触发onCameraMove方法?

解决GoogleMap调用moveCamera时无法触发onCameraMove的测试问题

在Widget测试环境中,GoogleMap的原生实现并未实例化,直接调用moveCamera不会自动触发onCameraMove回调——这类回调事件原本是由原生地图引擎主动发送给Flutter层的。要在测试中模拟这一行为,需要手动拦截平台通道并主动发送onCameraMove事件。

修改后的测试代码

import 'dart:async';

import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:flutter/services.dart';

void main() {
  TestWidgetsFlutterBinding.ensureInitialized();

  testWidgets('GoogleMaps onCameraMove triggers after moveCamera', (WidgetTester tester) async {
    final Completer<GoogleMapController> controllerCompleter = Completer<GoogleMapController>();
    final cameraMoveCompleter = Completer<bool>();
    // 获取Google Maps的平台MethodChannel
    final mapChannel = MethodChannel('plugins.flutter.io/google_maps');

    await tester.pumpWidget(Directionality(
      textDirection: TextDirection.ltr,
      child: GoogleMap(
        initialCameraPosition: const CameraPosition(target: LatLng(1, 2)),
        onMapCreated: (GoogleMapController c) {
          controllerCompleter.complete(c);
        },
        onCameraMove: (position) {
          cameraMoveCompleter.complete(true);
        },
      ),
    ));
    await tester.pumpAndSettle();

    final GoogleMapController controller = await controllerCompleter.future;
    // 调用moveCamera
    await controller.moveCamera(CameraUpdate.newLatLng(const LatLng(2, 3)));

    // 手动模拟原生端发送onCameraMove事件
    await mapChannel.invokeMethod<void>(
      'camera#onCameraMove',
      <String, dynamic>{
        'position': <String, dynamic>{
          'target': <String, dynamic>{'lat': 2.0, 'lng': 3.0},
          'zoom': 14.0, // 默认缩放值,可按需调整
          'bearing': 0.0,
          'tilt': 0.0,
        },
      },
    );

    await tester.pump(); // 触发Flutter框架处理事件

    expect(cameraMoveCompleter.isCompleted, true);
  });
}

关键说明

  • 测试环境中可直接拦截Flutter与原生的通信通道,通过MethodChannel获取Google Maps的通道后,就能主动模拟原生侧发送的事件。
  • camera#onCameraMove是Google Maps插件定义的事件方法名,参数结构必须严格匹配插件内部的预期格式,否则无法正确触发回调。
  • 调用invokeMethod后需执行tester.pump(),确保Flutter框架处理事件并执行onCameraMove回调。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:05:38