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.
This commit is contained in:
Henrique Velloso
2026-02-19 16:48:04 -03:00
parent e1f00bd64e
commit 7579e96ea5
+44 -13
View File
@@ -20,6 +20,19 @@ final rootNavigatorKey = GlobalKey<NavigatorState>();
typedef _ResolvedRoute = ({String identifier, String? author}); typedef _ResolvedRoute = ({String identifier, String? author});
CustomTransitionPage<void> _noTransitionPage({
required GoRouterState state,
required Widget child,
}) {
return CustomTransitionPage<void>(
key: state.pageKey,
child: child,
transitionsBuilder: (context, animation, secondaryAnimation, child) => child,
transitionDuration: Duration.zero,
reverseTransitionDuration: Duration.zero,
);
}
_ResolvedRoute _resolveNaddrRouteId(String rawId) { _ResolvedRoute _resolveNaddrRouteId(String rawId) {
if (rawId.startsWith('naddr1')) { if (rawId.startsWith('naddr1')) {
try { try {
@@ -38,12 +51,15 @@ _ResolvedRoute _resolveNaddrRouteId(String rawId) {
GoRoute _appDetailRoute() { GoRoute _appDetailRoute() {
return GoRoute( return GoRoute(
path: 'app/:id', path: 'app/:id',
builder: (context, state) { pageBuilder: (context, state) {
final rawId = state.pathParameters['id']!; final rawId = state.pathParameters['id']!;
final resolved = _resolveNaddrRouteId(rawId); final resolved = _resolveNaddrRouteId(rawId);
return AppDetailScreen( return _noTransitionPage(
appId: resolved.identifier, state: state,
authorPubkey: resolved.author, child: AppDetailScreen(
appId: resolved.identifier,
authorPubkey: resolved.author,
),
); );
}, },
); );
@@ -53,12 +69,15 @@ GoRoute _appDetailRoute() {
GoRoute _stackDetailRoute() { GoRoute _stackDetailRoute() {
return GoRoute( return GoRoute(
path: 'stack/:id', path: 'stack/:id',
builder: (context, state) { pageBuilder: (context, state) {
final rawId = state.pathParameters['id']!; final rawId = state.pathParameters['id']!;
final resolved = _resolveNaddrRouteId(rawId); final resolved = _resolveNaddrRouteId(rawId);
return AppStackScreen( return _noTransitionPage(
stackId: resolved.identifier, state: state,
authorPubkey: resolved.author, child: AppStackScreen(
stackId: resolved.identifier,
authorPubkey: resolved.author,
),
); );
}, },
); );
@@ -68,9 +87,12 @@ GoRoute _stackDetailRoute() {
GoRoute _userRoute() { GoRoute _userRoute() {
return GoRoute( return GoRoute(
path: 'user/:pubkey', path: 'user/:pubkey',
builder: (context, state) { pageBuilder: (context, state) {
final pubkey = state.pathParameters['pubkey']!; final pubkey = state.pathParameters['pubkey']!;
return UserScreen(pubkey: pubkey); return _noTransitionPage(
state: state,
child: UserScreen(pubkey: pubkey),
);
}, },
); );
} }
@@ -104,7 +126,10 @@ final routerProvider = Provider<GoRouter>((ref) {
routes: [ routes: [
GoRoute( GoRoute(
path: '/search', path: '/search',
builder: (context, state) => const SearchScreen(), pageBuilder: (context, state) => _noTransitionPage(
state: state,
child: const SearchScreen(),
),
routes: [_appDetailRoute(), _stackDetailRoute(), _userRoute()], routes: [_appDetailRoute(), _stackDetailRoute(), _userRoute()],
), ),
], ],
@@ -114,7 +139,10 @@ final routerProvider = Provider<GoRouter>((ref) {
routes: [ routes: [
GoRoute( GoRoute(
path: '/updates', path: '/updates',
builder: (context, state) => const UpdatesScreen(), pageBuilder: (context, state) => _noTransitionPage(
state: state,
child: const UpdatesScreen(),
),
routes: [_appDetailRoute(), _stackDetailRoute(), _userRoute()], routes: [_appDetailRoute(), _stackDetailRoute(), _userRoute()],
), ),
], ],
@@ -124,7 +152,10 @@ final routerProvider = Provider<GoRouter>((ref) {
routes: [ routes: [
GoRoute( GoRoute(
path: '/profile', path: '/profile',
builder: (context, state) => const ProfileScreen(), pageBuilder: (context, state) => _noTransitionPage(
state: state,
child: const ProfileScreen(),
),
routes: [_appDetailRoute(), _stackDetailRoute(), _userRoute()], routes: [_appDetailRoute(), _stackDetailRoute(), _userRoute()],
), ),
], ],