package com.img.rabbit.pages import android.annotation.SuppressLint import android.util.Log import android.view.Gravity import android.widget.Toast import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.navigationBarsPadding 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.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.navigation.NavType import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.navArgument import com.img.rabbit.R import com.img.rabbit.components.CenterToast 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.mine.setting.BindScreen import com.img.rabbit.pages.screen.other.CameraGuideScreen import com.img.rabbit.route.ScreenRoute import com.img.rabbit.viewmodel.BindViewModel import com.img.rabbit.viewmodel.GeneralViewModel import com.img.rabbit.viewmodel.LoginViewModel import kotlinx.coroutines.delay // 定义底部导航的标签页 sealed class TabItem(val title: String, val router:String, val normalIconRes: Int, val selectedIconRes: Int, val normalColor: Color, val selectedColor: Color) { object Home : TabItem("首页", "home", R.mipmap.ic_home_normal, R.mipmap.ic_home_selected, Color(0xFFAAAAAA), Color(0xFF1A1A1A)) object Mine : TabItem("我的", "mine", R.mipmap.ic_mine_normal, R.mipmap.ic_mine_selected, Color(0xFFAAAAAA), Color(0xFF1A1A1A)) } @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @Composable fun MainScreen(generalViewModel: GeneralViewModel, loginViewModel: LoginViewModel) { val context = LocalContext.current 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 navBackStackEntry by navController.currentBackStackEntryAsState() LaunchedEffect(navBackStackEntry) { // 当返回到MineScreen页面时执行的操作 if (navBackStackEntry?.destination?.route == "home") { selectedTab = TabItem.Home // 显示TabBar generalViewModel.setNavigationBarVisible(true) }else if(navBackStackEntry?.destination?.route == "mine"){ selectedTab = TabItem.Mine // 显示TabBar generalViewModel.setNavigationBarVisible(true) } } // 网络状态监听 LaunchedEffect(networkStatus) { if (!networkStatus) { // 网络断开时的处理 Log.w("NetworkStatus","网络断开") //延迟500ms,确保页面初始化完成后,再跳转网络错误页面 delay(500) CenterToast.show("网络已断开,请检查网络设置!") /* navController.navigate("netError") generalViewModel.setNavigationBarVisible(false) */ }else{ /* if(navBackStackEntry?.destination?.route == "home"||navBackStackEntry?.destination?.route == "mine"){ generalViewModel.setNavigationBarVisible(true) } */ Log.w("NetworkStatus","网络已连接") } } Scaffold( bottomBar = { if (isNavigationBarVisible) { Column( modifier = Modifier.navigationBarsPadding() ) { Box(modifier = Modifier.height(52.dp)) { 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(0x1AD0D0D0)) ) } } } } ) { Box( modifier = Modifier.fillMaxSize() ) { // 导航主机 NavHost( navController = navController, startDestination = ScreenRoute.Home.route ) { // Tab页面 composable(ScreenRoute.Home.route) { HomeScreen( navController = navController, generalViewModel = generalViewModel, loadingCallback = LocalContext.current as? LoadingCallback ) } 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, loginViewModel = loginViewModel) } // 设置页面(Setting) composable(ScreenRoute.BindAccount.route) { AccountBindScreen(navController = navController) } composable(ScreenRoute.ManagerAccount.route) { AccountManagerScreen(navController = navController, loginViewModel = loginViewModel) } composable(ScreenRoute.AboutMine.route) { AboutScreen(navController = navController) } // 登录页面(Login) composable(ScreenRoute.Login.route) { LoginScreen( navController = navController, generalViewModel = generalViewModel, loginViewModel = loginViewModel, isVisibilityBreak = true ) } composable( route = "login?type={type}", arguments = listOf( navArgument("type") { type = NavType.IntType defaultValue = LoginViewModel.JumpLoginType.NORMAL.type } ) ) { backStackEntry -> val isVisibilityBreak = when(backStackEntry.arguments?.getInt("type")){ LoginViewModel.JumpLoginType.FROM_ADD.type -> { // 添加账号 true } LoginViewModel.JumpLoginType.FROM_LOGOUT.type -> { // 退出登录 false } else -> false } LoginScreen( navController = navController, generalViewModel = generalViewModel, loginViewModel = loginViewModel, isVisibilityBreak = isVisibilityBreak ) } // 绑定页面(Bind) /* composable(ScreenRoute.Bind.route) { BindScreen( navController = navController, generalViewModel = generalViewModel, bindType = BindViewModel.BindType.FROM_PHONE.type ) } */ composable( route = "bind?type={type}", arguments = listOf( navArgument("type") { type = NavType.IntType defaultValue = BindViewModel.BindType.FROM_PHONE.type } ) ) { backStackEntry -> BindScreen( navController = navController, generalViewModel = generalViewModel, bindType = backStackEntry.arguments?.getInt("type")?:BindViewModel.BindType.FROM_PHONE.type ) } //无网承载页 composable(ScreenRoute.NetError.route) { NetworkDisconnectedPage( navController = navController, generalViewModel = generalViewModel, ){ } } } // 根据选中的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 } } } } } } }