# 02-导航和布局设计 ## 目标 配置 React Navigation 导航系统,实现 Tab 导航和 Stack 导航。 --- ## UI 设计参考 > 参考设计稿:`files/ui/首页.png` ### 底部 Tab 导航规范 | Tab | 图标 | 文字 | |-----|------|------| | 首页 | 房屋图标 `home` | 首页 | | AI问答 | 对话气泡 `chat-processing` | AI问答 | | 体质分析 | 心电图 `chart-line-variant` | 体质分析 | | 我的 | 用户图标 `account` | 我的 | ### Tab 样式规范 ```typescript const tabBarOptions = { activeTintColor: '#10B981', // 选中颜色 inactiveTintColor: '#9CA3AF', // 未选中颜色 style: { height: 60, paddingBottom: 8, paddingTop: 8, backgroundColor: '#FFFFFF', borderTopWidth: 1, borderTopColor: '#E5E7EB', }, labelStyle: { fontSize: 12, }, } ``` --- ## 前置要求 - 项目结构已初始化 - React Navigation 已安装 - 模拟数据服务已创建 --- ## 实施步骤 ### 步骤 1:创建导航类型定义 创建 `src/navigation/types.ts`: ```typescript import type { NativeStackNavigationProp } from '@react-navigation/native-stack' import type { BottomTabNavigationProp } from '@react-navigation/bottom-tabs' import type { CompositeNavigationProp, RouteProp } from '@react-navigation/native' // Root Stack export type RootStackParamList = { Auth: undefined Main: undefined } // Auth Stack export type AuthStackParamList = { Login: undefined } // Main Tab export type MainTabParamList = { HomeTab: undefined ChatTab: undefined ConstitutionTab: undefined ProfileTab: undefined } // Home Stack export type HomeStackParamList = { Home: undefined } // Chat Stack export type ChatStackParamList = { ChatList: undefined ChatDetail: { id: string } } // Constitution Stack export type ConstitutionStackParamList = { ConstitutionHome: undefined ConstitutionQuestions: undefined ConstitutionResult: undefined } // Profile Stack export type ProfileStackParamList = { ProfileHome: undefined HealthRecord: undefined } // Navigation Props export type RootNavigationProp = NativeStackNavigationProp export type ChatNavigationProp = CompositeNavigationProp< NativeStackNavigationProp, BottomTabNavigationProp > // Route Props export type ChatDetailRouteProp = RouteProp ``` ### 步骤 2:创建认证状态 Store 创建 `src/stores/useAuthStore.ts`: ```typescript import { create } from 'zustand' import AsyncStorage from '@react-native-async-storage/async-storage' import { User } from '../types' interface AuthState { isLoggedIn: boolean user: User | null login: (user: User) => void logout: () => void } export const useAuthStore = create((set) => ({ isLoggedIn: false, user: null, login: (user) => { AsyncStorage.setItem('user', JSON.stringify(user)) set({ isLoggedIn: true, user }) }, logout: () => { AsyncStorage.removeItem('user') set({ isLoggedIn: false, user: null }) }, })) ``` ### 步骤 3:创建主 Tab 导航 创建 `src/navigation/MainTabNavigator.tsx`: ```typescript import React from 'react' import { createBottomTabNavigator } from '@react-navigation/bottom-tabs' import Icon from 'react-native-vector-icons/MaterialCommunityIcons' import type { MainTabParamList } from './types' import HomeNavigator from './HomeNavigator' import ChatNavigator from './ChatNavigator' import ConstitutionNavigator from './ConstitutionNavigator' import ProfileNavigator from './ProfileNavigator' const Tab = createBottomTabNavigator() const MainTabNavigator = () => { return ( ( ), }} /> ( ), }} /> ( ), }} /> ( ), }} /> ) } export default MainTabNavigator ``` ### 步骤 4:创建子导航器 创建 `src/navigation/HomeNavigator.tsx`: ```typescript import React from 'react' import { createNativeStackNavigator } from '@react-navigation/native-stack' import type { HomeStackParamList } from './types' import HomeScreen from '../screens/home/HomeScreen' const Stack = createNativeStackNavigator() const HomeNavigator = () => { return ( ) } export default HomeNavigator ``` 创建 `src/navigation/ChatNavigator.tsx`: ```typescript import React from 'react' import { createNativeStackNavigator } from '@react-navigation/native-stack' import type { ChatStackParamList } from './types' import ChatListScreen from '../screens/chat/ChatListScreen' import ChatDetailScreen from '../screens/chat/ChatDetailScreen' const Stack = createNativeStackNavigator() const ChatNavigator = () => { return ( ) } export default ChatNavigator ``` 创建 `src/navigation/ConstitutionNavigator.tsx`: ```typescript import React from 'react' import { createNativeStackNavigator } from '@react-navigation/native-stack' import type { ConstitutionStackParamList } from './types' import ConstitutionHomeScreen from '../screens/constitution/ConstitutionHomeScreen' import ConstitutionQuestionsScreen from '../screens/constitution/ConstitutionQuestionsScreen' import ConstitutionResultScreen from '../screens/constitution/ConstitutionResultScreen' const Stack = createNativeStackNavigator() const ConstitutionNavigator = () => { return ( ) } export default ConstitutionNavigator ``` 创建 `src/navigation/ProfileNavigator.tsx`: ```typescript import React from 'react' import { createNativeStackNavigator } from '@react-navigation/native-stack' import type { ProfileStackParamList } from './types' import ProfileHomeScreen from '../screens/profile/ProfileHomeScreen' import HealthRecordScreen from '../screens/profile/HealthRecordScreen' const Stack = createNativeStackNavigator() const ProfileNavigator = () => { return ( ) } export default ProfileNavigator ``` ### 步骤 5:创建根导航器 创建 `src/navigation/RootNavigator.tsx`: ```typescript import React from 'react' import { createNativeStackNavigator } from '@react-navigation/native-stack' import { useAuthStore } from '../stores/useAuthStore' import type { RootStackParamList } from './types' import LoginScreen from '../screens/auth/LoginScreen' import MainTabNavigator from './MainTabNavigator' const Stack = createNativeStackNavigator() const RootNavigator = () => { const { isLoggedIn } = useAuthStore() return ( {!isLoggedIn ? ( ) : ( )} ) } export default RootNavigator ``` ### 步骤 6:更新 App.tsx ```typescript import React from 'react' import { NavigationContainer } from '@react-navigation/native' import { PaperProvider } from 'react-native-paper' import { SafeAreaProvider } from 'react-native-safe-area-context' import RootNavigator from './src/navigation/RootNavigator' import { theme } from './src/theme' const App = () => { return ( ) } export default App ``` --- ## 导航结构 ``` RootNavigator ├── LoginScreen(未登录) └── MainTabNavigator(已登录) ├── HomeTab │ └── Home ├── ChatTab │ ├── ChatList │ └── ChatDetail ├── ConstitutionTab │ ├── ConstitutionHome │ ├── ConstitutionQuestions │ └── ConstitutionResult └── ProfileTab ├── ProfileHome └── HealthRecord ``` --- ## 需要创建的文件清单 | 文件路径 | 说明 | |----------|------| | `src/navigation/types.ts` | 导航类型定义 | | `src/stores/useAuthStore.ts` | 认证状态 | | `src/navigation/RootNavigator.tsx` | 根导航 | | `src/navigation/MainTabNavigator.tsx` | Tab 导航 | | `src/navigation/HomeNavigator.tsx` | 首页导航 | | `src/navigation/ChatNavigator.tsx` | 对话导航 | | `src/navigation/ConstitutionNavigator.tsx` | 体质导航 | | `src/navigation/ProfileNavigator.tsx` | 个人导航 | --- ## 验收标准 - [ ] 导航结构配置正确 - [ ] Tab 导航显示正常 - [ ] Stack 导航跳转正常 - [ ] 登录状态切换导航正常 --- ## 预计耗时 30-40 分钟 --- ## 下一步 完成后进入 `02-APP原型开发/03-登录页面.md`