更新主活动和ViewModel工厂

This commit is contained in:
徐在坤
2026-01-17 19:35:04 +08:00
parent 188946bbad
commit 6d59348ff6
2 changed files with 123 additions and 36 deletions

View File

@@ -5,36 +5,59 @@ import android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.filled.AccountBox import androidx.compose.material3.*
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.material.icons.filled.Home
import androidx.compose.material3.Icon
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.adaptive.navigationsuite.NavigationSuiteScaffold
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
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.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.tooling.preview.PreviewScreenSizes
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsControllerCompat
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import android.view.WindowManager
import com.huaga.life_echo.navigation.AppNavigation import com.huaga.life_echo.navigation.AppNavigation
import com.huaga.life_echo.navigation.Screen import com.huaga.life_echo.navigation.Screen
import com.huaga.life_echo.ui.icons.AppIcons
import com.huaga.life_echo.ui.theme.LifeechoTheme import com.huaga.life_echo.ui.theme.LifeechoTheme
import com.huaga.life_echo.ui.theme.LightPurple
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
// 启用边缘到边缘显示
enableEdgeToEdge() enableEdgeToEdge()
// 设置系统栏透明
WindowCompat.setDecorFitsSystemWindows(window, false)
// 设置状态栏完全透明
window.statusBarColor = android.graphics.Color.TRANSPARENT
window.navigationBarColor = android.graphics.Color.TRANSPARENT
// 设置状态栏控制器,让内容可以延伸到状态栏下方
val windowInsetsController = WindowCompat.getInsetsController(window, window.decorView)
windowInsetsController.isAppearanceLightStatusBars = !com.huaga.life_echo.ui.settings.AppSettings.darkMode
setContent { setContent {
LifeechoTheme { val darkMode = com.huaga.life_echo.ui.settings.AppSettings.darkMode
LifeechoTheme(darkTheme = darkMode) {
// 根据主题更新状态栏图标颜色
androidx.compose.runtime.LaunchedEffect(darkMode) {
val windowInsetsController = WindowCompat.getInsetsController(window, window.decorView)
windowInsetsController.isAppearanceLightStatusBars = !darkMode
}
LifeechoApp() LifeechoApp()
} }
} }
@@ -46,45 +69,104 @@ class MainActivity : ComponentActivity() {
@Composable @Composable
fun LifeechoApp() { fun LifeechoApp() {
val navController = rememberNavController() val navController = rememberNavController()
var currentDestination by rememberSaveable { mutableStateOf(AppDestinations.HOME) } var currentDestination by rememberSaveable { mutableStateOf(AppDestinations.CHAT) }
// 获取当前路由,判断是否显示底部导航栏
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentRoute = navBackStackEntry?.destination?.route
val shouldShowBottomBar = currentRoute != null && !currentRoute.startsWith("create_memory")
NavigationSuiteScaffold( Scaffold(
navigationSuiteItems = { modifier = Modifier.fillMaxSize(),
AppDestinations.entries.forEach { bottomBar = {
item( // 底部导航栏 - 只在非聊天详情页显示
icon = { if (shouldShowBottomBar) {
Icon( Surface(
it.icon, modifier = Modifier
contentDescription = it.label .fillMaxWidth()
.windowInsetsPadding(WindowInsets.navigationBars)
.padding(bottom = 8.dp),
color = MaterialTheme.colorScheme.surface,
shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp),
shadowElevation = 8.dp
) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 8.dp),
horizontalArrangement = Arrangement.SpaceEvenly,
verticalAlignment = Alignment.CenterVertically
) {
AppDestinations.entries.forEach { destination ->
BottomNavItem(
destination = destination,
isSelected = currentDestination == destination,
onClick = {
currentDestination = destination
when (destination) {
AppDestinations.CHAT -> navController.navigate(Screen.ConversationList.route) {
popUpTo(Screen.ConversationList.route) { inclusive = true }
}
AppDestinations.MEMOIR -> navController.navigate(Screen.MyMemoir.route) {
popUpTo(Screen.ConversationList.route) { inclusive = false }
}
AppDestinations.PROFILE -> navController.navigate(Screen.Profile.route) {
popUpTo(Screen.ConversationList.route) { inclusive = false }
}
}
}
) )
},
label = { Text(it.label) },
selected = it == currentDestination,
onClick = {
currentDestination = it
when (it) {
AppDestinations.HOME -> navController.navigate(Screen.CreateMemory.route)
AppDestinations.FAVORITES -> navController.navigate(Screen.MyMemoir.route)
AppDestinations.PROFILE -> navController.navigate(Screen.Profile.route)
}
} }
) }
}
} }
} }
) { ) { paddingValues ->
Scaffold(modifier = Modifier.fillMaxSize()) { Box(modifier = Modifier.padding(paddingValues)) {
AppNavigation(navController = navController) AppNavigation(navController = navController)
} }
} }
} }
@Composable
fun BottomNavItem(
destination: AppDestinations,
isSelected: Boolean,
onClick: () -> Unit
) {
val iconColor = if (isSelected) LightPurple else MaterialTheme.colorScheme.onSurfaceVariant
val textColor = if (isSelected) LightPurple else MaterialTheme.colorScheme.onSurfaceVariant
Column(
modifier = Modifier
.clickable { onClick() }
.padding(horizontal = 16.dp, vertical = 4.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Icon(
imageVector = destination.icon,
contentDescription = destination.label,
tint = iconColor,
modifier = Modifier.size(24.dp)
)
Spacer(modifier = Modifier.height(4.dp))
Text(
text = destination.label,
fontSize = 12.sp,
color = textColor,
fontWeight = if (isSelected) FontWeight.Bold else FontWeight.Normal
)
}
}
enum class AppDestinations( enum class AppDestinations(
val label: String, val label: String,
val icon: ImageVector, val icon: ImageVector,
) { ) {
HOME("Home", Icons.Default.Home), CHAT("聊天", AppIcons.Chat),
FAVORITES("Favorites", Icons.Default.Favorite), MEMOIR("回忆录", AppIcons.Memoir),
PROFILE("Profile", Icons.Default.AccountBox), PROFILE("我的", AppIcons.Profile),
} }
@Composable @Composable

View File

@@ -33,6 +33,11 @@ class ViewModelFactory(private val context: Context) : ViewModelProvider.Factory
chapterRepository = chapterRepository chapterRepository = chapterRepository
) as T ) as T
} }
modelClass.isAssignableFrom(ConversationListViewModel::class.java) -> {
ConversationListViewModel(
conversationRepository = conversationRepository
) as T
}
modelClass.isAssignableFrom(MyMemoirViewModel::class.java) -> { modelClass.isAssignableFrom(MyMemoirViewModel::class.java) -> {
MyMemoirViewModel( MyMemoirViewModel(
chapterRepository = chapterRepository, chapterRepository = chapterRepository,