package com.img.rabbit.pages import android.annotation.SuppressLint import android.util.Log import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import com.img.rabbit.pages.screen.mine.FeedbackScreen import com.img.rabbit.pages.screen.mine.OnlineServiceScreen import com.img.rabbit.pages.screen.mine.SettingScreen import androidx.compose.material3.Icon import androidx.compose.material3.NavigationBar import androidx.compose.material3.NavigationBarItem import androidx.compose.material3.NavigationBarItemDefaults import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import com.img.rabbit.R import com.img.rabbit.pages.screen.HomeScreen import com.img.rabbit.pages.screen.MineScreen import com.img.rabbit.pages.screen.make.CutoutScreen import com.img.rabbit.pages.screen.make.FormatScreen import com.img.rabbit.pages.screen.make.LongImageScreen import com.img.rabbit.pages.screen.make.ResizeScreen import com.img.rabbit.pages.screen.mine.setting.AboutScreen import com.img.rabbit.pages.screen.mine.setting.AccountBindScreen import com.img.rabbit.pages.screen.mine.setting.AccountManagerScreen import com.img.rabbit.pages.screen.other.CameraGuideScreen import com.img.rabbit.route.ScreenRoute import com.img.rabbit.viewmodel.GeneralViewModel import com.img.rabbit.viewmodel.LoginViewModel // 定义底部导航的标签页 sealed class TabItem(val title: String, val normalIconRes: Int, val selectedIconRes: Int, val normalColor: Color, val selectedColor: Color) { object Home : TabItem("首页", R.mipmap.ic_home_normal, R.mipmap.ic_home_selected, Color(0xFFAAAAAA), Color(0xFF1A1A1A)) object Mine : TabItem("我的", R.mipmap.ic_mine_normal, R.mipmap.ic_mine_selected, Color(0xFFAAAAAA), Color(0xFF1A1A1A)) } @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @Composable fun MainScreen(generalViewModel: GeneralViewModel, loginViewModel: LoginViewModel) { val navController = rememberNavController() val networkStatus by generalViewModel.networkStatus.observeAsState(initial = true) val isNavigationBarVisible by generalViewModel.isNavigationBarVisible.observeAsState(initial = true) val tabItems = listOf( TabItem.Home, TabItem.Mine ) var selectedTab: TabItem by remember { mutableStateOf(TabItem.Home) } // 监听返回事件 val currentBackStackEntry = navController.currentBackStackEntry LaunchedEffect(currentBackStackEntry) { // 当返回到MineScreen页面时执行的操作 if (currentBackStackEntry?.destination?.route == "home") { // 显示TabBar generalViewModel.setNavigationBarVisible(true) } } // 网络状态监听 LaunchedEffect(networkStatus) { if (!networkStatus) { // 网络断开时的处理 Log.w("NetworkStatus","网络断开") }else{ Log.w("NetworkStatus","网络已连接") } } Scaffold( bottomBar = { if (isNavigationBarVisible) { Box { NavigationBar( containerColor = Color.White, contentColor = Color.Transparent ) { tabItems.forEachIndexed { index, item -> val iconRes = if (selectedTab == tabItems[index]) { item.selectedIconRes } else { item.normalIconRes } NavigationBarItem( icon = { Icon( painter = painterResource(id = iconRes), contentDescription = item.title, tint = Color.Unspecified ) }, label = { Text(item.title, color = if (selectedTab == tabItems[index]) item.selectedColor else item.normalColor) }, selected = selectedTab == tabItems[index], onClick = { selectedTab = tabItems[index] }, colors = NavigationBarItemDefaults.colors( indicatorColor = Color.Transparent ) ) } } // 顶部横线 Box( modifier = Modifier .fillMaxWidth() .height(1.dp) .background(Color.Gray.copy(alpha = 0.3f)) ) } } } ) { Box( modifier = Modifier.fillMaxSize() ) { // 导航主机 NavHost( navController = navController, startDestination = ScreenRoute.Home.route ) { // Tab页面 composable(ScreenRoute.Home.route) { HomeScreen( navController = navController, generalViewModel = generalViewModel ) } composable(ScreenRoute.Mine.route) { MineScreen( navController = navController, generalViewModel = generalViewModel ) } // 抠图页面(Cutout) composable(ScreenRoute.Cutout.route) { CutoutScreen(navController = navController) } // 证件页面(Certificate) composable(ScreenRoute.Resize.route) { ResizeScreen(navController = navController) } // 格式页面(Format) composable(ScreenRoute.Format.route) { FormatScreen(navController = navController) } // 拍照指南页面(CameraGuide) composable(ScreenRoute.CameraGuide.route) { CameraGuideScreen(navController = navController) } // 长图页面(LongImage) composable(ScreenRoute.LongImage.route) { LongImageScreen(navController = navController) } // 我的页面(Mine) composable(ScreenRoute.Feedback.route) { FeedbackScreen(navController = navController) } composable(ScreenRoute.OnlineService.route) { OnlineServiceScreen(navController = navController) } composable(ScreenRoute.Setting.route) { SettingScreen(navController = navController) } // 设置页面(Setting) composable(ScreenRoute.BindAccount.route) { AccountBindScreen(navController = navController) } composable(ScreenRoute.ManagerAccount.route) { AccountManagerScreen(navController = navController) } composable(ScreenRoute.AboutMine.route) { AboutScreen(navController = navController) } // 登录页面(Login) composable(ScreenRoute.Login.route) { LoginScreen( navController = navController, generalViewModel = generalViewModel, loginViewModel = loginViewModel ) } } // 根据选中的Tab切换导航路由 LaunchedEffect(selectedTab) { when (selectedTab) { TabItem.Home -> navController.navigate(ScreenRoute.Home.route) { popUpTo(ScreenRoute.Home.route) { inclusive = true } } TabItem.Mine -> navController.navigate(ScreenRoute.Mine.route) { popUpTo(ScreenRoute.Mine.route) { inclusive = true } } } } } } }