Flutter: Mapbox onMapCreated не вызывается в тесте виджетов

Я использую карту Mapbox, и когда я запускаю приложение в эмуляторе, оно работает нормально. Однако в моем тесте виджетов onMapCreated метод никогда не вызывается, что делает невозможным тестирование поведения приложения.

My 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 никогда не печатается.

При запуске приложения в эмуляторе вызывается оператор печати.

Кто-нибудь знает, что здесь происходит?

1 ответ

Я столкнулся с той же проблемой и решил ее обойти, вызвав обратные вызовы вручную. Примерно так в вашем тесте виджетов:

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

Где "<mocked controller" - это экземпляр вашего MapboxMapController насмехаться.

Я предполагаю, что основная проблема связана с тем, что собственное представление карты на самом деле не загружается во время тестов виджетов, и поэтому обратные вызовы не вызываются.

Другие вопросы по тегам