From 6dc2bf6375582fee0f9792a275206717f80c5109 Mon Sep 17 00:00:00 2001 From: CloudWebRTC Date: Wed, 8 Mar 2023 10:28:10 +0800 Subject: [PATCH] fix: Fix renderer issue for Safari/Firefox. (#241) * fix: Fix renderer issue for Safari. * fix: fix compile for native. * chore: Improve flickering. --- lib/src/support/platform.dart | 11 +++++++++++ lib/src/support/platform/io.dart | 4 ++++ lib/src/support/platform/web.dart | 11 +++++++++++ lib/src/widgets/video_track_renderer.dart | 8 ++++++-- pubspec.yaml | 1 + 5 files changed, 33 insertions(+), 2 deletions(-) diff --git a/lib/src/support/platform.dart b/lib/src/support/platform.dart index f216483..d0b59ca 100644 --- a/lib/src/support/platform.dart +++ b/lib/src/support/platform.dart @@ -9,6 +9,8 @@ bool lkPlatformIs(PlatformType type) => lkPlatform() == type; bool lkPlatformIsTest() => Platform.environment.containsKey('FLUTTER_TEST'); +BrowserType lkBrowser() => lkBrowserImplementation(); + enum PlatformType { web, windows, @@ -18,3 +20,12 @@ enum PlatformType { fuchsia, iOS, } + +enum BrowserType { + chrome, + firefox, + safari, + internetExplorer, + wkWebView, + unknown, +} diff --git a/lib/src/support/platform/io.dart b/lib/src/support/platform/io.dart index 2c13a92..e393d98 100644 --- a/lib/src/support/platform/io.dart +++ b/lib/src/support/platform/io.dart @@ -11,3 +11,7 @@ PlatformType lkPlatformImplementation() { if (Platform.isAndroid) return PlatformType.android; throw UnsupportedError('Unknown Platform'); } + +BrowserType lkBrowserImplementation() { + return BrowserType.unknown; +} diff --git a/lib/src/support/platform/web.dart b/lib/src/support/platform/web.dart index ff54692..f9fd4aa 100644 --- a/lib/src/support/platform/web.dart +++ b/lib/src/support/platform/web.dart @@ -1,3 +1,14 @@ import '../platform.dart'; +import 'package:platform_detect/platform_detect.dart'; + PlatformType lkPlatformImplementation() => PlatformType.web; + +BrowserType lkBrowserImplementation() { + if (browser.isChrome) return BrowserType.chrome; + if (browser.isFirefox) return BrowserType.firefox; + if (browser.isSafari) return BrowserType.safari; + if (browser.isInternetExplorer) return BrowserType.internetExplorer; + if (browser.isWKWebView) return BrowserType.wkWebView; + return BrowserType.unknown; +} diff --git a/lib/src/widgets/video_track_renderer.dart b/lib/src/widgets/video_track_renderer.dart index 66dc156..a33c6bc 100644 --- a/lib/src/widgets/video_track_renderer.dart +++ b/lib/src/widgets/video_track_renderer.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; +import 'package:livekit_client/src/support/platform.dart'; import '../events.dart'; import '../extensions.dart'; @@ -78,15 +79,18 @@ class _VideoTrackRendererState extends State { @override void didUpdateWidget(covariant VideoTrackRenderer oldWidget) { super.didUpdateWidget(oldWidget); - // if (widget.track != oldWidget.track) { oldWidget.track.removeViewKey(_internalKey); _internalKey = widget.track.addViewKey(); - // TODO: re-attach only if needed (() async { await _attach(); })(); } + + if ([BrowserType.safari, BrowserType.firefox].contains(lkBrowser()) && + oldWidget.key != widget.key) { + _renderer.srcObject = widget.track.mediaStream; + } } @override diff --git a/pubspec.yaml b/pubspec.yaml index 134d537..73cd546 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -28,6 +28,7 @@ dependencies: device_info_plus: ^8.0.0 webrtc_interface: 1.0.11 dart_webrtc: 1.0.15 + platform_detect: ^2.0.7 dev_dependencies: flutter_test: