1、修正路由
This commit is contained in:
shenzuqiang 2026-02-28 18:04:21 +08:00
parent d558fde6f3
commit 32a4827eb1
7 changed files with 76 additions and 32 deletions

View File

@ -13,18 +13,14 @@ import androidx.compose.animation.core.Animatable
import androidx.compose.animation.core.tween import androidx.compose.animation.core.tween
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.layout.wrapContentWidth

View File

@ -1,7 +1,10 @@
package com.img.rabbit.pages package com.img.rabbit.pages
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity
import android.util.Log import android.util.Log
import android.widget.Toast
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.border import androidx.compose.foundation.border
@ -37,6 +40,7 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState import androidx.compose.runtime.MutableState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.mutableLongStateOf
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
@ -44,11 +48,13 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.navigation.NavType import androidx.navigation.NavType
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.navArgument import androidx.navigation.navArgument
import com.img.rabbit.R import com.img.rabbit.R
import com.img.rabbit.pages.screen.HomeScreen import com.img.rabbit.pages.screen.HomeScreen
@ -69,14 +75,15 @@ import com.img.rabbit.viewmodel.GeneralViewModel
import com.img.rabbit.viewmodel.LoginViewModel import com.img.rabbit.viewmodel.LoginViewModel
// 定义底部导航的标签页 // 定义底部导航的标签页
sealed class TabItem(val title: String, val normalIconRes: Int, val selectedIconRes: Int, val normalColor: Color, val selectedColor: Color) { sealed class TabItem(val title: String, val router: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 Home : TabItem("首页", "home", 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)) object Mine : TabItem("我的", "mine", R.mipmap.ic_mine_normal, R.mipmap.ic_mine_selected, Color(0xFFAAAAAA), Color(0xFF1A1A1A))
} }
@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
@Composable @Composable
fun MainScreen(generalViewModel: GeneralViewModel, loginViewModel: LoginViewModel) { fun MainScreen(generalViewModel: GeneralViewModel, loginViewModel: LoginViewModel) {
val context = LocalContext.current
val navController = rememberNavController() val navController = rememberNavController()
val networkStatus by generalViewModel.networkStatus.observeAsState(initial = true) val networkStatus by generalViewModel.networkStatus.observeAsState(initial = true)
@ -87,12 +94,11 @@ fun MainScreen(generalViewModel: GeneralViewModel, loginViewModel: LoginViewMode
) )
var selectedTab: TabItem by remember { mutableStateOf(TabItem.Home) } var selectedTab: TabItem by remember { mutableStateOf(TabItem.Home) }
// 监听返回事件 // 获取当前路由状态
val currentBackStackEntry = navController.currentBackStackEntry val navBackStackEntry by navController.currentBackStackEntryAsState()
LaunchedEffect(navBackStackEntry) {
LaunchedEffect(currentBackStackEntry) {
// 当返回到MineScreen页面时执行的操作 // 当返回到MineScreen页面时执行的操作
if (currentBackStackEntry?.destination?.route == "home") { if (navBackStackEntry?.destination?.route == "home") {
// 显示TabBar // 显示TabBar
generalViewModel.setNavigationBarVisible(true) generalViewModel.setNavigationBarVisible(true)
} }
@ -158,14 +164,6 @@ fun MainScreen(generalViewModel: GeneralViewModel, loginViewModel: LoginViewMode
navController = navController, navController = navController,
startDestination = ScreenRoute.Home.route startDestination = ScreenRoute.Home.route
) { ) {
// Main页面
composable(ScreenRoute.Main.route) {
MainScreen(
generalViewModel = generalViewModel,
loginViewModel = loginViewModel
)
}
// Tab页面 // Tab页面
composable(ScreenRoute.Home.route) { composable(ScreenRoute.Home.route) {
HomeScreen( HomeScreen(

View File

@ -1,5 +1,8 @@
package com.img.rabbit.pages.screen package com.img.rabbit.pages.screen
import android.app.Activity
import android.widget.Toast
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
@ -22,7 +25,10 @@ import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableLongStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
@ -35,6 +41,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.img.rabbit.R import com.img.rabbit.R
import com.img.rabbit.route.ScreenRoute import com.img.rabbit.route.ScreenRoute
@ -45,12 +52,25 @@ fun HomeScreen(navController: NavHostController,generalViewModel: GeneralViewMod
val context = LocalContext.current val context = LocalContext.current
val scrollState = rememberScrollState() val scrollState = rememberScrollState()
// 监听返回事件 // 获取当前路由状态
val currentBackStackEntry = navController.currentBackStackEntry val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentRoute = navBackStackEntry?.destination?.route
// 只有当当前路由处于首页 Tab 之一时,才激活 BackHandler
var lastClickTime by remember { mutableLongStateOf(0L) }
LaunchedEffect(currentBackStackEntry) { BackHandler(enabled = (currentRoute == ScreenRoute.Home.route)) {
val currentTime = System.currentTimeMillis()
if (currentTime - lastClickTime > 2000) {
Toast.makeText(context, "再按一次退出应用", Toast.LENGTH_SHORT).show()
lastClickTime = currentTime
} else {
(context as? Activity)?.finish()
}
}
LaunchedEffect(navBackStackEntry) {
// 当返回到MineScreen页面时执行的操作 // 当返回到MineScreen页面时执行的操作
if (currentBackStackEntry?.destination?.route == "home") { if (navBackStackEntry?.destination?.route == "home") {
// 显示TabBar // 显示TabBar
generalViewModel.setNavigationBarVisible(true) generalViewModel.setNavigationBarVisible(true)
} }

View File

@ -1,8 +1,10 @@
package com.img.rabbit.pages.screen package com.img.rabbit.pages.screen
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
@ -24,6 +26,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableLongStateOf
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
@ -44,12 +47,14 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import coil3.compose.AsyncImage import coil3.compose.AsyncImage
import com.img.rabbit.BuildConfig import com.img.rabbit.BuildConfig
import com.img.rabbit.R import com.img.rabbit.R
import com.img.rabbit.provider.storage.GlobalStateManager import com.img.rabbit.provider.storage.GlobalStateManager
import com.img.rabbit.provider.storage.PreferenceUtil import com.img.rabbit.provider.storage.PreferenceUtil
import com.img.rabbit.route.ScreenRoute
import com.img.rabbit.utils.AppUpdate import com.img.rabbit.utils.AppUpdate
import com.img.rabbit.viewmodel.GeneralViewModel import com.img.rabbit.viewmodel.GeneralViewModel
import com.img.rabbit.viewmodel.LoginViewModel import com.img.rabbit.viewmodel.LoginViewModel
@ -71,15 +76,28 @@ fun MineScreen(
var globalBind by mutableStateOf(GlobalStateManager(context).globalBindNotifyFlow().collectAsState(initial = false)) var globalBind by mutableStateOf(GlobalStateManager(context).globalBindNotifyFlow().collectAsState(initial = false))
var globalUnBind by mutableStateOf(GlobalStateManager(context).globalUnBindNotifyFlow().collectAsState(initial = false)) var globalUnBind by mutableStateOf(GlobalStateManager(context).globalUnBindNotifyFlow().collectAsState(initial = false))
val vipMember by remember { mutableStateOf(false) } //val vipMember by remember { mutableStateOf(false) }
var userInfo by remember { mutableStateOf(PreferenceUtil.getUserInfo()) } var userInfo by remember { mutableStateOf(PreferenceUtil.getUserInfo()) }
// 监听返回事件 // 获取当前路由状态
val currentBackStackEntry = navController.currentBackStackEntry val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentRoute = navBackStackEntry?.destination?.route
// 只有当当前路由处于首页 Tab 之一时,才激活 BackHandler
var lastClickTime by remember { mutableLongStateOf(0L) }
LaunchedEffect(currentBackStackEntry) { BackHandler(enabled = (currentRoute == ScreenRoute.Home.route || currentRoute == ScreenRoute.Mine.route)) {
val currentTime = System.currentTimeMillis()
if (currentTime - lastClickTime > 2000) {
Toast.makeText(context, "再按一次退出应用", Toast.LENGTH_SHORT).show()
lastClickTime = currentTime
} else {
(context as? Activity)?.finish()
}
}
LaunchedEffect(navBackStackEntry) {
// 当返回到MineScreen页面时执行的操作 // 当返回到MineScreen页面时执行的操作
if (currentBackStackEntry?.destination?.route == "mine") { if (navBackStackEntry?.destination?.route == "mine") {
// 显示TabBar // 显示TabBar
generalViewModel.setNavigationBarVisible(true) generalViewModel.setNavigationBarVisible(true)
} }

View File

@ -418,7 +418,12 @@ fun CutoutScreen(navController: NavController) {
} else { } else {
// 空状态 // 空状态
Column( Column(
modifier = Modifier.align(Alignment.Center) modifier = Modifier.align(Alignment.Center).clickable(
interactionSource = remember { MutableInteractionSource() },
indication = null
){
imagePickerLauncher.launch("image/*")
}
) { ) {
Image( Image(
painter = painterResource(id = R.mipmap.ic_image_empty_pld), painter = painterResource(id = R.mipmap.ic_image_empty_pld),

View File

@ -29,6 +29,7 @@ import androidx.compose.ui.unit.sp
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.img.rabbit.R import com.img.rabbit.R
import com.img.rabbit.route.ScreenRoute
@Composable @Composable
fun TitleBar(navController: NavController?, paddingValues: PaddingValues, title: String? = "", showSave: Boolean = false, showBreak: Boolean = true, onSubmit: (() -> Unit)? = null) { fun TitleBar(navController: NavController?, paddingValues: PaddingValues, title: String? = "", showSave: Boolean = false, showBreak: Boolean = true, onSubmit: (() -> Unit)? = null) {
@ -50,7 +51,13 @@ fun TitleBar(navController: NavController?, paddingValues: PaddingValues, title:
indication = null, indication = null,
interactionSource = remember { MutableInteractionSource() } interactionSource = remember { MutableInteractionSource() }
) { ) {
navController?.popBackStack() // 获取当前路由状态
val navBackStackEntry = navController?.currentBackStackEntry
val currentRoute = navBackStackEntry?.destination?.route
if(currentRoute != ScreenRoute.Home.route && currentRoute != ScreenRoute.Mine.route){
navController?.popBackStack()
}
} }
.padding(end = 26.dp) .padding(end = 26.dp)
) )

View File

@ -3,7 +3,7 @@ package com.img.rabbit.route
// 定义导航路由 // 定义导航路由
sealed class ScreenRoute(val route: String) { sealed class ScreenRoute(val route: String) {
//Main页面 //Main页面
object Main : ScreenRoute("main") // object Main : ScreenRoute("main")
//Tab页面 //Tab页面
object Home : ScreenRoute("home") object Home : ScreenRoute("home")
object Mine : ScreenRoute("mine") object Mine : ScreenRoute("mine")