parent
d558fde6f3
commit
32a4827eb1
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
|
|
||||||
|
|
@ -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,8 +51,14 @@ fun TitleBar(navController: NavController?, paddingValues: PaddingValues, title:
|
||||||
indication = null,
|
indication = null,
|
||||||
interactionSource = remember { MutableInteractionSource() }
|
interactionSource = remember { MutableInteractionSource() }
|
||||||
) {
|
) {
|
||||||
|
// 获取当前路由状态
|
||||||
|
val navBackStackEntry = navController?.currentBackStackEntry
|
||||||
|
val currentRoute = navBackStackEntry?.destination?.route
|
||||||
|
|
||||||
|
if(currentRoute != ScreenRoute.Home.route && currentRoute != ScreenRoute.Mine.route){
|
||||||
navController?.popBackStack()
|
navController?.popBackStack()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
.padding(end = 26.dp)
|
.padding(end = 26.dp)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue