1

我正在使用 Mapbox 地图,当我在模拟器中运行应用程序时,它运行良好。但是,在我的小部件测试中,该onMapCreated方法从未被调用,这使得无法测试应用程序的行为。

我的 MapWidget(精简版):

class MapWidget extends StatefulWidget {
  final LatLng initialCameraPositionCoordinates;
  final double initialZoomLevel;

  const MapWidget({
    Key key,
    @required this.initialCameraPositionCoordinates,
    @required this.initialZoomLevel,
   }) : super(key: key);
  
  @override
  State createState() => MapWidgetState();
}

class MapWidgetState extends State<MapWidget> {
  @override
  Widget build(BuildContext context) {
    return BlocConsumer<Cubit, State>(
      builder: (context, state) {
        return MouseRegion(
          cursor: MouseCursor.defer,
          child: MapboxMap(
            onMapCreated: _onMapCreated,
          ),
        );
      },
    );
}

void _onMapCreated(MapboxMapController controller) async {
    print("This is never called in the test");
}

相应的小部件测试如下所示:

void main() {
    testWidgets("Mapbox", (WidgetTester tester) async {
        await tester.pumpWidget(
          BlocProvider(
            create: (_) => _cubit,
            child: MaterialApp(
              home: MapWidget(
                initialCameraPositionCoordinates:
                    _initialCameraPositionCorrdinates,
                initialZoomLevel: _initialZoomLevel,
              ),
            ),
          ),
        );
        await tester.pump(Duration(seconds: 10));
      });
}

没有抛出异常,这意味着它渲染得很好。但是,onMapCreated从不打印中的打印语句。

在模拟器中运行应用程序时,会调用 print 语句。

有谁知道这里发生了什么?

4

1 回答 1

0

我遇到了同样的问题,并通过手动调用回调来解决它。在您的小部件测试中是这样的:

var mapboxMap = tester.firstWidget(find.byType(MapboxMap)) as MapboxMap;
mapboxMap.onMapCreated!(<mocked controller>);
mapboxMap.onStyleLoadedCallback!();

其中“<mocked controller”是你的MapboxMapController模拟实例。

我想根本问题与在小部件测试期间实际上未加载的本机地图视图有关,因此,没有调用回调。

于 2021-09-11T16:18:56.393 回答