From 32a4827eb1e59449fef051e0aa666a69cff2c4f0 Mon Sep 17 00:00:00 2001 From: shenzuqiang Date: Sat, 28 Feb 2026 18:04:21 +0800 Subject: [PATCH] =?UTF-8?q?Dev=EF=BC=9A=201=E3=80=81=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E8=B7=AF=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/img/rabbit/MainActivity.kt | 4 --- .../java/com/img/rabbit/pages/MainPage.kt | 30 +++++++++---------- .../com/img/rabbit/pages/screen/HomeScreen.kt | 28 ++++++++++++++--- .../com/img/rabbit/pages/screen/MineScreen.kt | 28 +++++++++++++---- .../rabbit/pages/screen/make/CutoutScreen.kt | 7 ++++- .../com/img/rabbit/pages/toolbar/TitleBar.kt | 9 +++++- .../java/com/img/rabbit/route/ScreenRoute.kt | 2 +- 7 files changed, 76 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/com/img/rabbit/MainActivity.kt b/app/src/main/java/com/img/rabbit/MainActivity.kt index 9716377..c53892b 100644 --- a/app/src/main/java/com/img/rabbit/MainActivity.kt +++ b/app/src/main/java/com/img/rabbit/MainActivity.kt @@ -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 diff --git a/app/src/main/java/com/img/rabbit/pages/MainPage.kt b/app/src/main/java/com/img/rabbit/pages/MainPage.kt index 6cd64cd..017ebf3 100644 --- a/app/src/main/java/com/img/rabbit/pages/MainPage.kt +++ b/app/src/main/java/com/img/rabbit/pages/MainPage.kt @@ -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( diff --git a/app/src/main/java/com/img/rabbit/pages/screen/HomeScreen.kt b/app/src/main/java/com/img/rabbit/pages/screen/HomeScreen.kt index ec496d4..cae3c8c 100644 --- a/app/src/main/java/com/img/rabbit/pages/screen/HomeScreen.kt +++ b/app/src/main/java/com/img/rabbit/pages/screen/HomeScreen.kt @@ -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) } diff --git a/app/src/main/java/com/img/rabbit/pages/screen/MineScreen.kt b/app/src/main/java/com/img/rabbit/pages/screen/MineScreen.kt index ca4edb8..5c8dcee 100644 --- a/app/src/main/java/com/img/rabbit/pages/screen/MineScreen.kt +++ b/app/src/main/java/com/img/rabbit/pages/screen/MineScreen.kt @@ -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) } diff --git a/app/src/main/java/com/img/rabbit/pages/screen/make/CutoutScreen.kt b/app/src/main/java/com/img/rabbit/pages/screen/make/CutoutScreen.kt index b26d1ae..63263c6 100644 --- a/app/src/main/java/com/img/rabbit/pages/screen/make/CutoutScreen.kt +++ b/app/src/main/java/com/img/rabbit/pages/screen/make/CutoutScreen.kt @@ -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), diff --git a/app/src/main/java/com/img/rabbit/pages/toolbar/TitleBar.kt b/app/src/main/java/com/img/rabbit/pages/toolbar/TitleBar.kt index 226041b..4448257 100644 --- a/app/src/main/java/com/img/rabbit/pages/toolbar/TitleBar.kt +++ b/app/src/main/java/com/img/rabbit/pages/toolbar/TitleBar.kt @@ -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,7 +51,13 @@ fun TitleBar(navController: NavController?, paddingValues: PaddingValues, title: indication = null, 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) ) diff --git a/app/src/main/java/com/img/rabbit/route/ScreenRoute.kt b/app/src/main/java/com/img/rabbit/route/ScreenRoute.kt index edb4c73..f8578b2 100644 --- a/app/src/main/java/com/img/rabbit/route/ScreenRoute.kt +++ b/app/src/main/java/com/img/rabbit/route/ScreenRoute.kt @@ -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")