如何在颤振中返回现有的平台视图

时间:2021-04-28 12:37:02

标签: flutter flutter-plugin flutter-video-player

我在 Flutter 中使用平台视图来支持我的 Flutter 插件中的 DRM 视频播放,如下所示: 以下平台视图的实施来自:

https://flutter.dev/docs/development/platform-integration/platform-views?tab=android-platform-views-java-tab#hybrid-composition


Widget build(BuildContext context) {
    final String viewType = 'irdetodrmvideo';
    _controller = widget.controller;
    final Map<String, dynamic> creationParams = <String, dynamic>{
      "videoUrl": widget.videoUrl,
      "drmLicenseUrl": widget.drmLicenseUrl,
      "autoPlay": widget.autoPlay
    };

    return PlatformViewLink(
      viewType: viewType,
      surfaceFactory:
          (BuildContext context, PlatformViewController controller) {
        return AndroidViewSurface(
          controller: controller,
          gestureRecognizers: const <Factory<OneSequenceGestureRecognizer>>{},
          hitTestBehavior: PlatformViewHitTestBehavior.opaque,
        );
      },
      onCreatePlatformView: (PlatformViewCreationParams params) {
        return PlatformViewsService.initSurfaceAndroidView(
          id: params.id,
          viewType: viewType,
          layoutDirection: TextDirection.ltr,
          creationParams: creationParams,
          creationParamsCodec: StandardMessageCodec(),
        )
          ..addOnPlatformViewCreatedListener(params.onPlatformViewCreated)
          ..addOnPlatformViewCreatedListener((int id) {
            if (widget.onVideoControls == null) {
              return;
            }

            print("Platform View ID " + id.toString());
              //Initialize and start the Flutter Video Player
              VideoController _controller = VideoController()..init(id);             
              _controller.initialize();

              if (widget.autoPlay) _controller.play();
              widget.onVideoControls(_controller);
            }
          })
          ..create();
      },
    );
  }

我试图使用以下包中的参考来实现全屏实现: https://pub.flutter-io.cn/packages/chewie

此包在 Widget 树的根部使用 Inherited Widget,然后使用 Page Route Builder 将 Video Player Widget 推送到 Navigation Route。

我目前面临的问题是,当我们路由到全屏时,它总是会创建一个新的平台视图,其中包含在 Android 平台端实现的新方法通道和控制器。

有没有办法使用继承的小部件在小部件树中获取现有的平台视图。类似的方法是使用纹理视图(由 flutter 视频播放器包使用),因为它们得到在 VideoController 中仅初始化一次,并且 VideoPlayer 视图基于 Texture ID 返回,因为它使用 Surface 纹理注册表。但是在平台视图的这个实现中,当使用插件中的 DrmVideoPlayer 小部件时,它总是初始化视频控制器并创建视频播放器的新实例。

这总是会创建一个新的平台视图,如果它存在于小部件树中以支持全屏功能,我们是否可以返回已经存在的视图。 可以在此处找到问题的更多详细信息: https://github.com/ponnamkarthik/drm_video/issues/6

0 个答案:

没有答案