diff --git a/lib/features/recording/pages/page_record.dart b/lib/features/recording/pages/page_record.dart index c438ffa..3e54ad4 100644 --- a/lib/features/recording/pages/page_record.dart +++ b/lib/features/recording/pages/page_record.dart @@ -135,7 +135,13 @@ class _RecordingPageState extends ConsumerState { final result = await ref .read(recordingViewModelProvider.notifier) .ensureCameraAndMicrophonePermissions(); - if (result.allGranted) return true; + if (result.allGranted) { + final ready = ref.read(recordingViewModelProvider).session.isPreviewReady; + if (ready) return true; + if (!mounted) return false; + AppToast.show('相机预览启动失败,请重试'); + return false; + } if (!mounted) return false; await RecordDialog.showSingle( diff --git a/lib/features/recording/view-model/view_model_recording.dart b/lib/features/recording/view-model/view_model_recording.dart index 01429c3..2f6f8a9 100644 --- a/lib/features/recording/view-model/view_model_recording.dart +++ b/lib/features/recording/view-model/view_model_recording.dart @@ -280,6 +280,12 @@ class RecordingViewModel extends Notifier { _updateSession((s) => s.copyWith(isMicrophoneGranted: microphoneGranted)); + if (cameraGranted && !state.session.isPreviewReady) { + _updateSession((s) => s.copyWith(errorMessage: null)); + await _listenStatus(); + await restorePreview(); + } + return RecordingRequiredPermissions( cameraGranted: cameraGranted, microphoneGranted: microphoneGranted, @@ -293,9 +299,13 @@ class RecordingViewModel extends Notifier { /// 开始录制,可选开启勿扰模式。 Future startRecording({bool enableDoNotDisturb = true}) async { final session = state.session; - if (!session.isPreviewReady || - session.isRecording || - session.isStartingRecording) { + if (session.isRecording || session.isStartingRecording) { + return; + } + if (!session.isPreviewReady) { + _updateSession( + (s) => s.copyWith(errorMessage: '相机预览未就绪,请稍后重试'), + ); return; }