ente/lib/utils/navigation_util.dart

150 lines
3.4 KiB
Dart
Raw Normal View History

import 'dart:io';
import 'package:flutter/material.dart';
Future<T?> routeToPage<T extends Object>(
BuildContext context,
Widget page, {
bool forceCustomPageRoute = false,
}) {
if (Platform.isAndroid || forceCustomPageRoute) {
return Navigator.of(context).push(
_buildPageRoute(page),
);
} else {
return Navigator.of(context).push(
2022-08-13 14:50:34 +00:00
SwipeableRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) {
return page;
},
),
);
}
2021-06-09 13:37:20 +00:00
}
void replacePage(BuildContext context, Widget page) {
Navigator.of(context).pushReplacement(
_buildPageRoute(page),
);
}
PageRouteBuilder<T> _buildPageRoute<T extends Object>(Widget page) {
2021-06-09 13:37:20 +00:00
return PageRouteBuilder(
2022-06-11 08:23:52 +00:00
pageBuilder: (
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
) {
2021-06-09 13:37:20 +00:00
return page;
},
2022-06-11 08:23:52 +00:00
transitionsBuilder: (
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child,
) {
2021-06-09 13:37:20 +00:00
return Align(
child: FadeTransition(
opacity: animation,
child: child,
),
);
},
2022-07-04 06:02:17 +00:00
transitionDuration: const Duration(milliseconds: 200),
2021-06-09 13:37:20 +00:00
opaque: false,
);
}
2022-08-10 06:28:16 +00:00
2022-08-13 14:50:34 +00:00
class SwipeableRouteBuilder<T> extends PageRoute<T> {
final RoutePageBuilder pageBuilder;
final PageTransitionsBuilder matchingBuilder =
const CupertinoPageTransitionsBuilder(); // Default iOS/macOS (to get the swipe right to go back gesture)
// final PageTransitionsBuilder matchingBuilder = const FadeUpwardsPageTransitionsBuilder(); // Default Android/Linux/Windows
SwipeableRouteBuilder({required this.pageBuilder});
2022-08-13 14:50:34 +00:00
@override
Null get barrierColor => null;
2022-08-13 14:50:34 +00:00
@override
Null get barrierLabel => null;
2022-08-13 14:50:34 +00:00
@override
Widget buildPage(
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
) {
return pageBuilder(context, animation, secondaryAnimation);
}
@override
bool get maintainState => true;
@override
Duration get transitionDuration => const Duration(
milliseconds: 300,
); // Can give custom Duration, unlike in MaterialPageRoute
@override
Widget buildTransitions(
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
Widget child,
) {
return matchingBuilder.buildTransitions<T>(
this,
context,
animation,
secondaryAnimation,
child,
);
}
@override
bool get opaque => false;
}
2022-08-10 06:28:16 +00:00
class TransparentRoute extends PageRoute<void> {
TransparentRoute({
required this.builder,
RouteSettings? settings,
2022-08-10 06:28:16 +00:00
}) : assert(builder != null),
super(settings: settings, fullscreenDialog: false);
final WidgetBuilder? builder;
2022-08-10 06:28:16 +00:00
@override
bool get opaque => false;
@override
Null get barrierColor => null;
2022-08-10 06:28:16 +00:00
@override
Null get barrierLabel => null;
2022-08-10 06:28:16 +00:00
@override
bool get maintainState => true;
@override
2022-08-11 12:51:03 +00:00
Duration get transitionDuration => const Duration(milliseconds: 200);
2022-08-10 06:28:16 +00:00
@override
Widget buildPage(
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
) {
final result = builder!(context);
2022-08-10 06:28:16 +00:00
return FadeTransition(
opacity: Tween<double>(begin: 0, end: 1).animate(animation),
child: Semantics(
scopesRoute: true,
explicitChildNodes: true,
child: result,
),
);
}
}