1.开始录制、结束录制增加

2. 增加电量检测、内存检查,是否低于 10%
This commit is contained in:
2026-06-04 18:25:58 +08:00
parent 124b4c1882
commit f49d208042
9 changed files with 267 additions and 0 deletions

View File

@@ -6,6 +6,8 @@ import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:recording_tool/core/platform/app_platform_info.dart';
import 'package:recording_tool/core/platform/device_health_checker.dart';
import 'package:recording_tool/core/utils/date_time_formatter.dart';
import 'package:recording_tool/features/recording/model/model_recording.dart';
import 'package:recording_tool/features/recording/recording_display_name.dart';
@@ -33,7 +35,20 @@ class _RecordingPageState extends ConsumerState<RecordingPage> {
WidgetsBinding.instance.addPostFrameCallback((_) => _bootstrap());
}
Future<void> _checkAndShowDeviceHealthAlerts() async {
final snapshot = await AppPlatformInfo.deviceHealth();
if (!mounted) return;
final lines = DeviceHealthChecker.warningLines(snapshot);
if (lines.isEmpty) return;
await AppDialog.deviceHealthAlert(context, lines: lines);
}
Future<void> _bootstrap() async {
await _checkAndShowDeviceHealthAlerts();
if (!mounted) return;
final clipboardResult = await ref
.read(recordingViewModelProvider.notifier)
.getClipboardContent();
@@ -95,6 +110,8 @@ class _RecordingPageState extends ConsumerState<RecordingPage> {
await _showNoPlayerInfoDialog();
return;
}
await _checkAndShowDeviceHealthAlerts();
if (!mounted) return;
await ref.read(recordingSessionControllerProvider.notifier).startRecording();
}

View File

@@ -4,6 +4,7 @@ import 'dart:io';
import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:recording_tool/core/permission/permission_service.dart';
import 'package:recording_tool/core/utils/rate_limiter.dart';
import 'package:recording_tool/features/recording/recording_display_name.dart';
import 'package:recording_tool/features/recording/recording_platform.dart';
import 'package:recording_tool/features/recording/view-model/view_model_recording.dart';
@@ -95,7 +96,12 @@ final recordingSessionControllerProvider =
);
class RecordingSessionController extends Notifier<RecordingSessionState> {
static const Duration _recordingActionInterval = Duration(milliseconds: 300);
static const Object _startRecordingThrottleKey = 'recording.session.start';
static const Object _stopRecordingThrottleKey = 'recording.session.stop';
StreamSubscription<RecordingStatus>? _statusSubscription;
final _rateLimit = RateLimitHub();
@override
RecordingSessionState build() {
@@ -207,7 +213,21 @@ class RecordingSessionController extends Notifier<RecordingSessionState> {
return _galleryPermissions().isEmpty;
}
bool _tryAcquireRecordingAction(Object key) {
var executed = false;
_rateLimit.throttle<void>(
key: key,
value: null,
duration: _recordingActionInterval,
options: const ThrottleOptions(leading: true, trailing: false),
onCallback: (_) => executed = true,
);
return executed;
}
Future<void> startRecording({bool enableDoNotDisturb = true}) async {
if (!_tryAcquireRecordingAction(_startRecordingThrottleKey)) return;
if (!state.isPreviewReady ||
state.isRecording ||
state.isStartingRecording) {
@@ -239,6 +259,8 @@ class RecordingSessionController extends Notifier<RecordingSessionState> {
}
Future<void> stopRecording() async {
if (!_tryAcquireRecordingAction(_stopRecordingThrottleKey)) return;
if (!state.isRecording) return;
try {
@@ -302,6 +324,7 @@ class RecordingSessionController extends Notifier<RecordingSessionState> {
}
Future<void> _dispose() async {
_rateLimit.clear();
await _statusSubscription?.cancel();
}
}