feat(flutter): 增加关键操作震动反馈

This commit is contained in:
Zhou Weidong committed 2026-10-17 16:15:46 +08:00
1 parent e609e3ad8d
commit 8a481d5c62
20 files changed
+308 -72

No files matched your search

+39
View File
@@ -0,0 +1,39 @@
// Author: fruit.com.cn
import 'package:flutter/services.dart';
/// User-action haptic feedback boundary.
abstract interface class Haptics {
/// Feedback for a selection change.
Future<void> selectionClick();
/// Feedback for a primary action.
Future<void> lightImpact();
/// Feedback for a destructive action.
Future<void> mediumImpact();
}
/// Default implementation backed by Flutter's platform haptics.
class FlutterHaptics implements Haptics {
const FlutterHaptics();
@override
Future<void> selectionClick() =>
_ignoreUnavailable(HapticFeedback.selectionClick);
@override
Future<void> lightImpact() => _ignoreUnavailable(HapticFeedback.lightImpact);
@override
Future<void> mediumImpact() =>
_ignoreUnavailable(HapticFeedback.mediumImpact);
Future<void> _ignoreUnavailable(Future<void> Function() feedback) async {
try {
await feedback();
} catch (_) {
// Haptics are optional and may be unavailable on the target device.
}
}
}
+4
View File
@@ -1,10 +1,13 @@
// Author: fruit.com.cn
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../../l10n/app_localizations.dart';
import '../data/services/download_controller.dart';
import '../platform/haptics.dart';
import 'auth_gate.dart';
/// 详情页与播放页共用的下载授权入口。
@@ -16,6 +19,7 @@ Future<void> requestEpisodeDownload(
) async {
if (!await ensureSignedIn(context)) return;
if (!context.mounted) return;
unawaited(context.read<Haptics>().lightImpact());
final result = await context.read<DownloadController>().grant(episodeId);
if (!context.mounted) return;
final l10n = AppLocalizations.of(context)!;