androidfluttervideorendering

After the Flutter 3 upgrade my embedded Native Android View is slow, does not react to click events and crashes


I have a native view containing a custom video player in my flutter app. After the Flutter 3 upgrade the view started stuttering, did not resize correctly or even stopped playing on resize and did not react to click events.

Does anyone have an Idea if flutter has changed anything? I cannot find anything in the changelogs.


Solution

  • I did not find anything in the changelogs, but found this flutter issue: https://github.com/flutter/flutter/issues/103630

    I found this solution there: replace PlatformViewsService.initSurfaceAndroidView with PlatformViewsService.initExpensiveAndroidView to get the old rendering behaviour.

    It says this should not be done if it can be avoided, but in my case it was the perfect solution.

    @override
      Widget buildView(
          Map<String, dynamic> creationParams,
          OnPlatformViewCreatedCallback onPlatformViewCreated,
          Set<Factory<OneSequenceGestureRecognizer>>? gestureRecognizers) {
        if (defaultTargetPlatform == TargetPlatform.android) {
    -      if (useHybridComposition) {
            return PlatformViewLink(
              viewType: 'plugins.flutter.io/mapbox_gl',
              surfaceFactory: (
                BuildContext context,
                PlatformViewController controller,
              ) {
                return AndroidViewSurface(
                  controller: controller as AndroidViewController,
                  gestureRecognizers: gestureRecognizers ??
                      const <Factory<OneSequenceGestureRecognizer>>{},
                  hitTestBehavior: PlatformViewHitTestBehavior.opaque,
                );
              },
              onCreatePlatformView: (PlatformViewCreationParams params) {
    -            final SurfaceAndroidViewController controller =
    +            final AndroidViewController controller =
    -                PlatformViewsService.initSurfaceAndroidView(
    +                PlatformViewsService.initExpensiveAndroidView(
                  id: params.id,
                  viewType: 'plugins.flutter.io/mapbox_gl',
                  layoutDirection: TextDirection.ltr,
                  creationParams: creationParams,
                  creationParamsCodec: const StandardMessageCodec(),
                  onFocus: () => params.onFocusChanged(true),
                );
                controller.addOnPlatformViewCreatedListener(
                  params.onPlatformViewCreated,
                );
                controller.addOnPlatformViewCreatedListener(
                  onPlatformViewCreated,
                );
    -            controller.create();
                return controller;
              },
            );
    -      } else {
    -        return AndroidView(
    -          viewType: 'plugins.flutter.io/mapbox_gl',
    -          onPlatformViewCreated: onPlatformViewCreated,
    -          gestureRecognizers: gestureRecognizers,
    -          creationParams: creationParams,
    -          creationParamsCodec: const StandardMessageCodec(),
    -        );
    -      }
        } else if (defaultTargetPlatform == TargetPlatform.iOS) {
          return UiKitView(
            viewType: 'plugins.flutter.io/mapbox_gl',
            onPlatformViewCreated: onPlatformViewCreated,
            gestureRecognizers: gestureRecognizers,
            creationParams: creationParams,
            creationParamsCodec: const StandardMessageCodec(),
          );
        }
        return Text(
            '