我在 Flutter 中使用平台视图来支持我的 Flutter 插件中的 DRM 视频播放,如下所示: 以下平台视图的实施来自:
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