优化录制页性能

This commit is contained in:
2026-07-28 13:47:25 +08:00
parent a56a42c7c8
commit 36253aacbe
7 changed files with 450 additions and 167 deletions
@@ -68,7 +68,6 @@ class _ApiVideoCameraPreviewState extends State<ApiVideoCameraPreview> {
@override
void dispose() {
widget.controller.stopPreview();
widget.controller.removeWidgetListener(_widgetListener);
widget.controller.removeEventsListener(_eventsListener);
super.dispose();
@@ -26,6 +26,8 @@ class ApiVideoLiveStreamController {
int get textureId => _textureId;
bool _isInitialized = false;
Future<void>? _initializeFuture;
Future<void>? _disposeFuture;
/// Gets the current state of the video player.
bool get isInitialized => _isInitialized;
@@ -68,7 +70,14 @@ class ApiVideoLiveStreamController {
}
/// Creates a new live stream instance with initial audio and video configurations.
Future<void> initialize() async {
Future<void> initialize() {
if (_disposeFuture != null) {
throw StateError('Cannot initialize a disposed controller');
}
return _initializeFuture ??= _initialize();
}
Future<void> _initialize() async {
_textureId = await _platform.initialize() ?? kUninitializedTextureId;
_eventSubscription = _platform
@@ -91,12 +100,23 @@ class ApiVideoLiveStreamController {
}
/// Disposes the live stream instance.
Future<void> dispose() async {
Future<void> dispose() {
return _disposeFuture ??= _dispose();
}
Future<void> _dispose() async {
try {
await _initializeFuture;
} catch (_) {
// A partially initialized native view still needs to be disposed.
}
await _eventSubscription?.cancel();
_eventSubscription = null;
_eventsListeners.clear();
_widgetListeners.clear();
await _platform.dispose();
return;
_isInitialized = false;
_textureId = kUninitializedTextureId;
}
/// Sets new video parameters.