feat: switch main navigation to stateful shell tabs

This commit is contained in:
qzl
2026-03-20 15:31:08 +08:00
parent a99973fb96
commit 0476f7f80c
5 changed files with 17 additions and 7 deletions
+3 -3
View File
@@ -27,10 +27,10 @@ import '../../features/settings/ui/screens/memory_screen.dart';
import '../../features/settings/ui/screens/edit_profile_screen.dart';
final _homeSecondLevelRoutes = [
AppRoutes.homeMain,
AppRoutes.calendarDayWeek,
AppRoutes.shellHomeBranch,
AppRoutes.shellCalendarBranch,
AppRoutes.calendarMonth,
AppRoutes.todoList,
AppRoutes.shellTodoBranch,
AppRoutes.settingsMain,
];
+3
View File
@@ -5,6 +5,9 @@ class AppRoutes {
static const authLogin = '/';
static const homeMain = '/home';
static const shellHomeBranch = homeMain;
static const shellCalendarBranch = calendarDayWeek;
static const shellTodoBranch = todoList;
static const messageInviteList = '/messages/invites';
static String messageInviteDetail(String id) => '/messages/invites/$id';
@@ -109,6 +109,7 @@ class BottomDock extends StatelessWidget {
return Material(
color: Colors.transparent,
child: InkWell(
key: const ValueKey('bottom_dock_home_button'),
onTap: onHomeTap,
borderRadius: BorderRadius.circular(AppRadius.xl),
child: Container(
@@ -3,7 +3,7 @@ import 'package:go_router/go_router.dart';
import '../../../../core/router/app_routes.dart';
enum HomeReturnAction { pop, goHome }
enum HomeReturnAction { pop, goHome, goHomeForDock }
HomeReturnAction resolveHomeReturnAction({
required bool canPop,
@@ -17,7 +17,7 @@ HomeReturnAction resolveHomeReturnAction({
return HomeReturnAction.goHome;
}
if (canPop) {
return HomeReturnAction.pop;
return HomeReturnAction.goHomeForDock;
}
return HomeReturnAction.goHome;
}
@@ -37,6 +37,7 @@ void returnToHomePreserveState(
context.pop();
return;
case HomeReturnAction.goHome:
case HomeReturnAction.goHomeForDock:
context.go(AppRoutes.homeMain);
return;
}
@@ -3,6 +3,11 @@ import 'package:social_app/features/home/ui/navigation/home_return_policy.dart';
void main() {
group('resolveHomeReturnAction', () {
test('dock home action should always resolve to goHome', () {
final action = resolveHomeReturnAction(canPop: true, isAuthEntry: false);
expect(action, HomeReturnAction.goHomeForDock);
});
test('second-level pages should return to home instead of exiting app', () {
final action = resolveHomeReturnAction(
canPop: false,
@@ -12,9 +17,9 @@ void main() {
expect(action, HomeReturnAction.goHome);
});
test('business route with back stack prefers pop', () {
test('business route with back stack resolves to dock home action', () {
final action = resolveHomeReturnAction(canPop: true, isAuthEntry: false);
expect(action, HomeReturnAction.pop);
expect(action, HomeReturnAction.goHomeForDock);
});
test('business route without back stack falls back to go home', () {