Files
sm-emby-share/lib/router/page_transitions.dart
T
2026-07-14 11:11:36 +08:00

84 lines
2.1 KiB
Dart

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
class PageTransitions {
PageTransitions._();
static const Duration detailForward = Duration(milliseconds: 280);
static const Duration detailReverse = Duration(milliseconds: 220);
static const Duration shellFade = Duration(milliseconds: 200);
static Duration get playerForward =>
defaultTargetPlatform == TargetPlatform.android
? Duration.zero
: detailForward;
static Duration get playerReverse =>
defaultTargetPlatform == TargetPlatform.android
? Duration.zero
: detailReverse;
static Widget fade(
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child,
) => FadeTransition(opacity: animation, child: child);
static Widget slideRight(
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child,
) {
final offset = Tween<Offset>(begin: const Offset(0.05, 0), end: Offset.zero)
.animate(
CurvedAnimation(
parent: animation,
curve: Curves.easeOut,
reverseCurve: Curves.easeIn,
),
);
return SlideTransition(
position: offset,
child: FadeTransition(opacity: animation, child: child),
);
}
static Widget slideRightFull(
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child,
) {
final offset = Tween<Offset>(begin: const Offset(1, 0), end: Offset.zero)
.animate(
CurvedAnimation(
parent: animation,
curve: Curves.easeOutCubic,
reverseCurve: Curves.easeInCubic,
),
);
return SlideTransition(
position: offset,
child: ClipRect(child: RepaintBoundary(child: child)),
);
}
static Widget player(
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child,
) {
if (defaultTargetPlatform == TargetPlatform.android) return child;
return slideRightFull(context, animation, secondaryAnimation, child);
}
}