diff --git a/.changes/render-platformview b/.changes/render-platformview new file mode 100644 index 000000000..672822457 --- /dev/null +++ b/.changes/render-platformview @@ -0,0 +1 @@ +patch type="changed" "Use iOS platform view rendering by default for VideoTrackRenderer auto mode" diff --git a/lib/src/widgets/video_track_renderer.dart b/lib/src/widgets/video_track_renderer.dart index 95b683bce..827a63efa 100644 --- a/lib/src/widgets/video_track_renderer.dart +++ b/lib/src/widgets/video_track_renderer.dart @@ -73,7 +73,7 @@ class VideoTrackRenderer extends StatefulWidget { this.track, { this.fit = VideoViewFit.contain, this.mirrorMode = VideoViewMirrorMode.auto, - this.renderMode = VideoRenderMode.texture, + this.renderMode = VideoRenderMode.auto, this.autoDisposeRenderer = true, this.cachedRenderer, this.autoCenter = true, @@ -93,10 +93,13 @@ class _VideoTrackRendererState extends State { // Used to compute visibility information late GlobalKey _internalKey; + bool get _shouldUsePlatformView { + if (![PlatformType.iOS, PlatformType.macOS].contains(lkPlatform())) return false; + if (widget.renderMode == VideoRenderMode.platformView) return true; + return widget.renderMode == VideoRenderMode.auto && widget.cachedRenderer == null; + } + Future _initializeRenderer() async { - if (lkPlatformIs(PlatformType.iOS) && widget.renderMode == VideoRenderMode.platformView) { - return Null as Future; - } if (_renderer == null) { _renderer = rtc.RTCVideoRenderer(); await _renderer!.initialize(); @@ -178,12 +181,23 @@ class _VideoTrackRendererState extends State { _renderer?.onResize = () { if (mounted) { setState(() { - _aspectRatio = (_renderer as rtc.RTCVideoRenderer?)?.videoValue.aspectRatio; + _aspectRatio = _rendererAspectRatio; }); } }; } + double? get _rendererAspectRatio { + final renderer = _renderer; + if (renderer is rtc.RTCVideoRenderer) { + return renderer.videoValue.aspectRatio; + } + if (renderer is rtc.RTCVideoPlatformViewController) { + return renderer.value.aspectRatio; + } + return null; + } + @override void didUpdateWidget(covariant VideoTrackRenderer oldWidget) { super.didUpdateWidget(oldWidget); @@ -218,8 +232,8 @@ class _VideoTrackRendererState extends State { }, ); - Widget _videoRendererView() { - if (lkPlatformIs(PlatformType.iOS) && widget.renderMode == VideoRenderMode.platformView) { + Widget _videoRendererView({required bool usePlatformView}) { + if (usePlatformView) { return rtc.RTCVideoPlatFormView( mirror: _shouldMirror(), objectFit: widget.fit.toRTCType(), @@ -238,11 +252,12 @@ class _VideoTrackRendererState extends State { ); } - Widget _videoViewForNative() => FutureBuilder( - future: _initializeRenderer(), + Widget _videoViewForNative() { + final usePlatformView = _shouldUsePlatformView; + return FutureBuilder( + future: usePlatformView ? null : _initializeRenderer(), builder: (context, snapshot) { - if ((snapshot.hasData && _renderer != null) || - (lkPlatformIs(PlatformType.iOS) && widget.renderMode == VideoRenderMode.platformView)) { + if ((snapshot.hasData && _renderer != null) || usePlatformView) { return Builder( key: _internalKey, builder: (ctx) { @@ -252,7 +267,7 @@ class _VideoTrackRendererState extends State { }); if (!lkPlatformIsMobile() || widget.track is! LocalVideoTrack) { - return _videoRendererView(); + return _videoRendererView(usePlatformView: usePlatformView); } return LayoutBuilder( builder: (BuildContext context, BoxConstraints constraints) { @@ -264,7 +279,7 @@ class _VideoTrackRendererState extends State { } }, onTapDown: (TapDownDetails details) => onViewFinderTap(details, constraints), - child: _videoRendererView(), + child: _videoRendererView(usePlatformView: usePlatformView), ); }, ); @@ -272,7 +287,9 @@ class _VideoTrackRendererState extends State { ); } return Container(); - }); + }, + ); + } // FutureBuilder will cause flickering for flutter web. so using // different rendering methods for web and native.