diff --git a/flutter_modular/lib/src/presenter/models/route.dart b/flutter_modular/lib/src/presenter/models/route.dart index 38ce239c..c75053d3 100644 --- a/flutter_modular/lib/src/presenter/models/route.dart +++ b/flutter_modular/lib/src/presenter/models/route.dart @@ -211,14 +211,16 @@ class CustomTransition { Animation, Animation, )? pageBuilder; + final RouteBuilder? routeBuilder; final Duration transitionDuration; final Duration reverseTransitionDuration; final bool opaque; CustomTransition( {required this.transitionBuilder, + this.pageBuilder, + this.routeBuilder, this.transitionDuration = const Duration(milliseconds: 300), this.reverseTransitionDuration = const Duration(milliseconds: 300), - this.opaque = true, - this.pageBuilder}); + this.opaque = true}); } diff --git a/flutter_modular/lib/src/presenter/navigation/modular_page.dart b/flutter_modular/lib/src/presenter/navigation/modular_page.dart index 95684df4..bcc605c9 100644 --- a/flutter_modular/lib/src/presenter/navigation/modular_page.dart +++ b/flutter_modular/lib/src/presenter/navigation/modular_page.dart @@ -42,6 +42,10 @@ class ModularPage extends Page { if (transitionType == TransitionType.custom && route.customTransition != null) { final transition = route.customTransition!; + if (transition.routeBuilder != null) { + return transition.routeBuilder!((context) => page, this) as Route; + } + return PageRouteBuilder( pageBuilder: transition.pageBuilder ?? (context, _, __) => page, opaque: transition.opaque, diff --git a/flutter_modular/test/src/presenter/navigation/modular_page_test.dart b/flutter_modular/test/src/presenter/navigation/modular_page_test.dart index 781e6b98..e2df3875 100644 --- a/flutter_modular/test/src/presenter/navigation/modular_page_test.dart +++ b/flutter_modular/test/src/presenter/navigation/modular_page_test.dart @@ -173,4 +173,25 @@ void main() { expect(page.createRoute(context), isA()); expect(page.route.isFullscreenDialog, equals(true)); }); + + test('createRoute custom route builder', () { + final args = ModularArguments.empty(); + final context = BuildContextMock(); + final route = ParallelRouteMock(); + final widget = Container(); + when(() => route.child).thenReturn((_) => widget); + when(() => route.uri).thenReturn(Uri.parse('/')); + when(() => route.transition).thenReturn(TransitionType.custom); + when(() => route.customTransition).thenReturn(CustomTransition( + transitionBuilder: (_, __, ___, child) => child, + routeBuilder: (builder, settings) => CupertinoSheetRoute( + builder: builder, + settings: settings, + ), + )); + + final page = ModularPage(args: args, flags: ModularFlags(), route: route); + final pageRoute = page.createRoute(context); + expect(pageRoute, isA()); + }); }