From 137eb72df956c8440344a529abc6f726d52d4672 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Mon, 25 May 2026 19:24:02 +0900 Subject: [PATCH 1/5] patch 1 --- lib/src/widgets/video_track_renderer.dart | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/src/widgets/video_track_renderer.dart b/lib/src/widgets/video_track_renderer.dart index 95b683bce..4d556b9cf 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,8 +93,12 @@ class _VideoTrackRendererState extends State { // Used to compute visibility information late GlobalKey _internalKey; + bool get _shouldUsePlatformView => + lkPlatformIs(PlatformType.iOS) && + [VideoRenderMode.auto, VideoRenderMode.platformView].contains(widget.renderMode); + Future _initializeRenderer() async { - if (lkPlatformIs(PlatformType.iOS) && widget.renderMode == VideoRenderMode.platformView) { + if (_shouldUsePlatformView) { return Null as Future; } if (_renderer == null) { @@ -219,7 +223,7 @@ class _VideoTrackRendererState extends State { ); Widget _videoRendererView() { - if (lkPlatformIs(PlatformType.iOS) && widget.renderMode == VideoRenderMode.platformView) { + if (_shouldUsePlatformView) { return rtc.RTCVideoPlatFormView( mirror: _shouldMirror(), objectFit: widget.fit.toRTCType(), @@ -241,8 +245,7 @@ class _VideoTrackRendererState extends State { Widget _videoViewForNative() => FutureBuilder( future: _initializeRenderer(), builder: (context, snapshot) { - if ((snapshot.hasData && _renderer != null) || - (lkPlatformIs(PlatformType.iOS) && widget.renderMode == VideoRenderMode.platformView)) { + if ((snapshot.hasData && _renderer != null) || _shouldUsePlatformView) { return Builder( key: _internalKey, builder: (ctx) { From 5c970bbf9ba94b3f30409f42aa07e05a0d3ee5e0 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Mon, 25 May 2026 19:27:34 +0900 Subject: [PATCH 2/5] changes 1 --- .changes/render-platformview | 1 + 1 file changed, 1 insertion(+) create mode 100644 .changes/render-platformview 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" From aa84562626699c4bec264334f9a5640f9ab0993d Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Mon, 25 May 2026 19:31:56 +0900 Subject: [PATCH 3/5] Respect cached renderers in auto video mode --- lib/src/widgets/video_track_renderer.dart | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/src/widgets/video_track_renderer.dart b/lib/src/widgets/video_track_renderer.dart index 4d556b9cf..91601dfa9 100644 --- a/lib/src/widgets/video_track_renderer.dart +++ b/lib/src/widgets/video_track_renderer.dart @@ -93,9 +93,11 @@ class _VideoTrackRendererState extends State { // Used to compute visibility information late GlobalKey _internalKey; - bool get _shouldUsePlatformView => - lkPlatformIs(PlatformType.iOS) && - [VideoRenderMode.auto, VideoRenderMode.platformView].contains(widget.renderMode); + bool get _shouldUsePlatformView { + if (!lkPlatformIs(PlatformType.iOS)) return false; + if (widget.renderMode == VideoRenderMode.platformView) return true; + return widget.renderMode == VideoRenderMode.auto && widget.cachedRenderer == null; + } Future _initializeRenderer() async { if (_shouldUsePlatformView) { From f301f990970f01b94f84e894d71a8411d6ca766e Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Mon, 25 May 2026 19:32:41 +0900 Subject: [PATCH 4/5] Simplify video render mode selection --- lib/src/widgets/video_track_renderer.dart | 36 +++++++++++++++-------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/lib/src/widgets/video_track_renderer.dart b/lib/src/widgets/video_track_renderer.dart index 91601dfa9..9987c7bed 100644 --- a/lib/src/widgets/video_track_renderer.dart +++ b/lib/src/widgets/video_track_renderer.dart @@ -100,9 +100,6 @@ class _VideoTrackRendererState extends State { } Future _initializeRenderer() async { - if (_shouldUsePlatformView) { - return Null as Future; - } if (_renderer == null) { _renderer = rtc.RTCVideoRenderer(); await _renderer!.initialize(); @@ -184,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); @@ -224,8 +232,8 @@ class _VideoTrackRendererState extends State { }, ); - Widget _videoRendererView() { - if (_shouldUsePlatformView) { + Widget _videoRendererView({required bool usePlatformView}) { + if (usePlatformView) { return rtc.RTCVideoPlatFormView( mirror: _shouldMirror(), objectFit: widget.fit.toRTCType(), @@ -244,10 +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) || _shouldUsePlatformView) { + if ((snapshot.hasData && _renderer != null) || usePlatformView) { return Builder( key: _internalKey, builder: (ctx) { @@ -257,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) { @@ -269,7 +279,7 @@ class _VideoTrackRendererState extends State { } }, onTapDown: (TapDownDetails details) => onViewFinderTap(details, constraints), - child: _videoRendererView(), + child: _videoRendererView(usePlatformView: usePlatformView), ); }, ); @@ -277,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. From 3294c45f35c046c4d94b67dc683ab840687a6240 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Mon, 25 May 2026 20:04:35 +0900 Subject: [PATCH 5/5] macos --- lib/src/widgets/video_track_renderer.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/widgets/video_track_renderer.dart b/lib/src/widgets/video_track_renderer.dart index 9987c7bed..827a63efa 100644 --- a/lib/src/widgets/video_track_renderer.dart +++ b/lib/src/widgets/video_track_renderer.dart @@ -94,7 +94,7 @@ class _VideoTrackRendererState extends State { late GlobalKey _internalKey; bool get _shouldUsePlatformView { - if (!lkPlatformIs(PlatformType.iOS)) return false; + if (![PlatformType.iOS, PlatformType.macOS].contains(lkPlatform())) return false; if (widget.renderMode == VideoRenderMode.platformView) return true; return widget.renderMode == VideoRenderMode.auto && widget.cachedRenderer == null; }