From 7579e96ea529fefd977206a29d32d351e56b7ca3 Mon Sep 17 00:00:00 2001 From: Henrique Velloso Date: Thu, 19 Feb 2026 16:48:04 -0300 Subject: [PATCH] Disable GoRouter page transitions to reduce weird navigation glitches Switch GoRouter routes from builder to pageBuilder and wrap pages with CustomTransitionPage using zero-duration/no-op transitions. This removes default Material route animations to reduce the weird transitions reported on low-performance scenarios in issue #310. --- lib/router.dart | 57 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 13 deletions(-) diff --git a/lib/router.dart b/lib/router.dart index 787c009..324248e 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -20,6 +20,19 @@ final rootNavigatorKey = GlobalKey(); typedef _ResolvedRoute = ({String identifier, String? author}); +CustomTransitionPage _noTransitionPage({ + required GoRouterState state, + required Widget child, +}) { + return CustomTransitionPage( + key: state.pageKey, + child: child, + transitionsBuilder: (context, animation, secondaryAnimation, child) => child, + transitionDuration: Duration.zero, + reverseTransitionDuration: Duration.zero, + ); +} + _ResolvedRoute _resolveNaddrRouteId(String rawId) { if (rawId.startsWith('naddr1')) { try { @@ -38,12 +51,15 @@ _ResolvedRoute _resolveNaddrRouteId(String rawId) { GoRoute _appDetailRoute() { return GoRoute( path: 'app/:id', - builder: (context, state) { + pageBuilder: (context, state) { final rawId = state.pathParameters['id']!; final resolved = _resolveNaddrRouteId(rawId); - return AppDetailScreen( - appId: resolved.identifier, - authorPubkey: resolved.author, + return _noTransitionPage( + state: state, + child: AppDetailScreen( + appId: resolved.identifier, + authorPubkey: resolved.author, + ), ); }, ); @@ -53,12 +69,15 @@ GoRoute _appDetailRoute() { GoRoute _stackDetailRoute() { return GoRoute( path: 'stack/:id', - builder: (context, state) { + pageBuilder: (context, state) { final rawId = state.pathParameters['id']!; final resolved = _resolveNaddrRouteId(rawId); - return AppStackScreen( - stackId: resolved.identifier, - authorPubkey: resolved.author, + return _noTransitionPage( + state: state, + child: AppStackScreen( + stackId: resolved.identifier, + authorPubkey: resolved.author, + ), ); }, ); @@ -68,9 +87,12 @@ GoRoute _stackDetailRoute() { GoRoute _userRoute() { return GoRoute( path: 'user/:pubkey', - builder: (context, state) { + pageBuilder: (context, state) { final pubkey = state.pathParameters['pubkey']!; - return UserScreen(pubkey: pubkey); + return _noTransitionPage( + state: state, + child: UserScreen(pubkey: pubkey), + ); }, ); } @@ -104,7 +126,10 @@ final routerProvider = Provider((ref) { routes: [ GoRoute( path: '/search', - builder: (context, state) => const SearchScreen(), + pageBuilder: (context, state) => _noTransitionPage( + state: state, + child: const SearchScreen(), + ), routes: [_appDetailRoute(), _stackDetailRoute(), _userRoute()], ), ], @@ -114,7 +139,10 @@ final routerProvider = Provider((ref) { routes: [ GoRoute( path: '/updates', - builder: (context, state) => const UpdatesScreen(), + pageBuilder: (context, state) => _noTransitionPage( + state: state, + child: const UpdatesScreen(), + ), routes: [_appDetailRoute(), _stackDetailRoute(), _userRoute()], ), ], @@ -124,7 +152,10 @@ final routerProvider = Provider((ref) { routes: [ GoRoute( path: '/profile', - builder: (context, state) => const ProfileScreen(), + pageBuilder: (context, state) => _noTransitionPage( + state: state, + child: const ProfileScreen(), + ), routes: [_appDetailRoute(), _stackDetailRoute(), _userRoute()], ), ],