优化交互体验增加动画效果

This commit is contained in:
2026-06-08 10:58:10 +08:00
parent 6b168ccd62
commit 942d15e54c
6 changed files with 250 additions and 78 deletions

View File

@@ -8,6 +8,8 @@ import 'package:recording_tool/gen/assets.gen.dart';
class RecordDialog extends StatelessWidget {
const RecordDialog({super.key, required this.title, required this.actions});
static const _transitionDuration = Duration(milliseconds: 280);
final String title;
final List<RecordDialogAction> actions;
@@ -18,8 +20,8 @@ class RecordDialog extends StatelessWidget {
VoidCallback? onPressed,
bool barrierDismissible = true,
}) {
return showDialog<void>(
context: context,
return _present(
context,
barrierDismissible: barrierDismissible,
builder: (dialogContext) {
return RecordDialog(
@@ -47,8 +49,8 @@ class RecordDialog extends StatelessWidget {
VoidCallback? onRightPressed,
bool barrierDismissible = false,
}) {
return showDialog<void>(
context: context,
return _present(
context,
barrierDismissible: barrierDismissible,
builder: (dialogContext) {
return RecordDialog(
@@ -74,6 +76,51 @@ class RecordDialog extends StatelessWidget {
);
}
static Future<void> _present(
BuildContext context, {
required Widget Function(BuildContext dialogContext) builder,
required bool barrierDismissible,
}) {
return showGeneralDialog<void>(
context: context,
barrierDismissible: barrierDismissible,
barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
barrierColor: Colors.black54,
transitionDuration: _transitionDuration,
pageBuilder: (dialogContext, animation, secondaryAnimation) {
return builder(dialogContext);
},
transitionBuilder: _buildTransition,
);
}
static Widget _buildTransition(
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child,
) {
final curved = CurvedAnimation(
parent: animation,
curve: Curves.easeOutCubic,
reverseCurve: Curves.easeInCubic,
);
return FadeTransition(
opacity: curved,
child: SlideTransition(
position: Tween<Offset>(
begin: const Offset(0, 0.08),
end: Offset.zero,
).animate(curved),
child: ScaleTransition(
scale: Tween<double>(begin: 0.92, end: 1).animate(curved),
child: child,
),
),
);
}
@override
Widget build(BuildContext context) {
final actionWidgets = actions