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.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.layout.wrapContentWidth

View File

@ -1,7 +1,10 @@
package com.img.rabbit.pages
import android.annotation.SuppressLint
import android.app.Activity
import android.util.Log
import android.widget.Toast
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.border
@ -37,6 +40,7 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.mutableLongStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
@ -44,11 +48,13 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.navigation.NavType
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.navArgument
import com.img.rabbit.R
import com.img.rabbit.pages.screen.HomeScreen
@ -69,14 +75,15 @@ 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))
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)
@ -87,12 +94,11 @@ fun MainScreen(generalViewModel: GeneralViewModel, loginViewModel: LoginViewMode
)
var selectedTab: TabItem by remember { mutableStateOf(TabItem.Home) }
// 监听返回事件
val currentBackStackEntry = navController.currentBackStackEntry
LaunchedEffect(currentBackStackEntry) {
// 获取当前路由状态
val navBackStackEntry by navController.currentBackStackEntryAsState()
LaunchedEffect(navBackStackEntry) {
// 当返回到MineScreen页面时执行的操作
if (currentBackStackEntry?.destination?.route == "home") {
if (navBackStackEntry?.destination?.route == "home") {
// 显示TabBar
generalViewModel.setNavigationBarVisible(true)
}
@ -158,14 +164,6 @@ fun MainScreen(generalViewModel: GeneralViewModel, loginViewModel: LoginViewMode
navController = navController,
startDestination = ScreenRoute.Home.route
) {
// Main页面
composable(ScreenRoute.Main.route) {
MainScreen(
generalViewModel = generalViewModel,
loginViewModel = loginViewModel
)
}
// Tab页面
composable(ScreenRoute.Home.route) {
HomeScreen(

View File

@ -1,5 +1,8 @@
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.background
import androidx.compose.foundation.clickable
@ -22,7 +25,10 @@ import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableLongStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
@ -35,6 +41,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavHostController
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import com.img.rabbit.R
import com.img.rabbit.route.ScreenRoute
@ -45,12 +52,25 @@ fun HomeScreen(navController: NavHostController,generalViewModel: GeneralViewMod
val context = LocalContext.current
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页面时执行的操作
if (currentBackStackEntry?.destination?.route == "home") {
if (navBackStackEntry?.destination?.route == "home") {
// 显示TabBar
generalViewModel.setNavigationBarVisible(true)
}

View File

@ -1,8 +1,10 @@
package com.img.rabbit.pages.screen
import android.annotation.SuppressLint
import android.app.Activity
import android.util.Log
import android.widget.Toast
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
@ -24,6 +26,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableLongStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
@ -44,12 +47,14 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavHostController
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import coil3.compose.AsyncImage
import com.img.rabbit.BuildConfig
import com.img.rabbit.R
import com.img.rabbit.provider.storage.GlobalStateManager
import com.img.rabbit.provider.storage.PreferenceUtil
import com.img.rabbit.route.ScreenRoute
import com.img.rabbit.utils.AppUpdate
import com.img.rabbit.viewmodel.GeneralViewModel
import com.img.rabbit.viewmodel.LoginViewModel
@ -71,15 +76,28 @@ fun MineScreen(
var globalBind by mutableStateOf(GlobalStateManager(context).globalBindNotifyFlow().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()) }
// 监听返回事件
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页面时执行的操作
if (currentBackStackEntry?.destination?.route == "mine") {
if (navBackStackEntry?.destination?.route == "mine") {
// 显示TabBar
generalViewModel.setNavigationBarVisible(true)
}

View File

@ -418,7 +418,12 @@ fun CutoutScreen(navController: NavController) {
} else {
// 空状态
Column(
modifier = Modifier.align(Alignment.Center)
modifier = Modifier.align(Alignment.Center).clickable(
interactionSource = remember { MutableInteractionSource() },
indication = null
){
imagePickerLauncher.launch("image/*")
}
) {
Image(
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.compose.rememberNavController
import com.img.rabbit.R
import com.img.rabbit.route.ScreenRoute
@Composable
fun TitleBar(navController: NavController?, paddingValues: PaddingValues, title: String? = "", showSave: Boolean = false, showBreak: Boolean = true, onSubmit: (() -> Unit)? = null) {
@ -50,8 +51,14 @@ fun TitleBar(navController: NavController?, paddingValues: PaddingValues, title:
indication = null,
interactionSource = remember { MutableInteractionSource() }
) {
// 获取当前路由状态
val navBackStackEntry = navController?.currentBackStackEntry
val currentRoute = navBackStackEntry?.destination?.route
if(currentRoute != ScreenRoute.Home.route && currentRoute != ScreenRoute.Mine.route){
navController?.popBackStack()
}
}
.padding(end = 26.dp)
)
}

View File

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