From 55fda08e06898091e97666129f2e3f90b545f57f Mon Sep 17 00:00:00 2001 From: acite <1498045907@qq.com> Date: Wed, 27 Aug 2025 01:50:53 +0800 Subject: [PATCH] [optimize] Optimize the video list loading logic to avoid duplicate loading and list mixing --- .../com/acitelight/aether/view/VideoScreen.kt | 29 +++++------- .../aether/viewModel/VideoScreenViewModel.kt | 45 +++++++------------ 2 files changed, 28 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/com/acitelight/aether/view/VideoScreen.kt b/app/src/main/java/com/acitelight/aether/view/VideoScreen.kt index 9254fbc..175143c 100644 --- a/app/src/main/java/com/acitelight/aether/view/VideoScreen.kt +++ b/app/src/main/java/com/acitelight/aether/view/VideoScreen.kt @@ -1,6 +1,5 @@ package com.acitelight.aether.view -import android.R.id.tabs import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -20,12 +19,7 @@ import androidx.compose.foundation.lazy.grid.items import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Card import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.PrimaryScrollableTabRow import androidx.compose.material3.Tab -import androidx.compose.material3.TabRow -import androidx.compose.material3.TabRowDefaults -import androidx.compose.material3.TabRowDefaults.tabIndicatorOffset import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState @@ -39,19 +33,16 @@ import androidx.compose.ui.unit.sp import androidx.lifecycle.viewmodel.compose.viewModel import coil3.compose.AsyncImage import com.acitelight.aether.model.Video -import com.acitelight.aether.service.MediaManager import com.acitelight.aether.viewModel.VideoScreenViewModel -import androidx.compose.material3.PrimaryTabRow import androidx.compose.material3.ScrollableTabRow -import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.Alignment import androidx.compose.ui.graphics.Brush import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.text.style.TextOverflow import androidx.navigation.NavHostController import coil3.request.ImageRequest import com.acitelight.aether.Global -import kotlinx.coroutines.flow.first import java.nio.charset.Charset fun String.toHex(): String { @@ -72,6 +63,7 @@ fun String.hexToString(charset: Charset = Charsets.UTF_8): String { @Composable fun VideoScreen(videoScreenViewModel: VideoScreenViewModel = viewModel(), navController: NavHostController) { + val tabIndex by videoScreenViewModel.tabIndex; videoScreenViewModel.SetupClient() Column( @@ -86,8 +78,11 @@ fun VideoScreen(videoScreenViewModel: VideoScreenViewModel = viewModel(), navCon horizontalArrangement = Arrangement.spacedBy(8.dp) ) { - items(videoScreenViewModel.videos) { video -> - VideoCard(video, navController, videoScreenViewModel) + if(videoScreenViewModel.classes.isNotEmpty()) + { + items(videoScreenViewModel.classesMap[videoScreenViewModel.classes[tabIndex]] ?: mutableStateListOf()) { video -> + VideoCard(video, navController, videoScreenViewModel) + } } } } @@ -98,12 +93,11 @@ fun VideoScreen(videoScreenViewModel: VideoScreenViewModel = viewModel(), navCon fun TopRow(videoScreenViewModel: VideoScreenViewModel) { val tabIndex by videoScreenViewModel.tabIndex; - val klasses by videoScreenViewModel.klasses.collectAsState(); - if(klasses.isEmpty()) return + if(videoScreenViewModel.classes.isEmpty()) return ScrollableTabRow (selectedTabIndex = tabIndex) { - klasses.forEachIndexed { index, title -> + videoScreenViewModel.classes.forEachIndexed { index, title -> Tab( selected = tabIndex == index, onClick = { videoScreenViewModel.setTabIndex(index) }, @@ -115,13 +109,14 @@ fun TopRow(videoScreenViewModel: VideoScreenViewModel) @Composable fun VideoCard(video: Video, navController: NavHostController, videoScreenViewModel: VideoScreenViewModel) { + val tabIndex by videoScreenViewModel.tabIndex; Card( shape = RoundedCornerShape(6.dp), modifier = Modifier .fillMaxWidth() .wrapContentHeight(), onClick = { - Global.sameClassVideos = videoScreenViewModel.videos + Global.sameClassVideos = videoScreenViewModel.classesMap[videoScreenViewModel.classes[tabIndex]] ?: mutableStateListOf() val route = "video_player_route/${ "${video.klass}/${video.id}".toHex() }" navController.navigate(route) } diff --git a/app/src/main/java/com/acitelight/aether/viewModel/VideoScreenViewModel.kt b/app/src/main/java/com/acitelight/aether/viewModel/VideoScreenViewModel.kt index 567afc1..4c50a8f 100644 --- a/app/src/main/java/com/acitelight/aether/viewModel/VideoScreenViewModel.kt +++ b/app/src/main/java/com/acitelight/aether/viewModel/VideoScreenViewModel.kt @@ -3,51 +3,35 @@ package com.acitelight.aether.viewModel import android.app.Application import androidx.compose.runtime.Composable import androidx.compose.runtime.State -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.mutableStateMapOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.snapshots.SnapshotStateList import androidx.compose.ui.platform.LocalContext import androidx.datastore.preferences.core.stringPreferencesKey import androidx.lifecycle.AndroidViewModel -import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import coil3.ImageLoader import coil3.network.okhttp.OkHttpNetworkFetcherFactory -import com.acitelight.aether.Global import com.acitelight.aether.dataStore import com.acitelight.aether.model.Video -import com.acitelight.aether.service.ApiClient import com.acitelight.aether.service.ApiClient.createOkHttp -import com.acitelight.aether.service.AuthManager import com.acitelight.aether.service.MediaManager import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch class VideoScreenViewModel(application: Application) : AndroidViewModel(application) { - private val dataStore = application.dataStore - private val USER_NAME_KEY = stringPreferencesKey("user_name") - private val PRIVATE_KEY = stringPreferencesKey("private_key") - - val userNameFlow: Flow = dataStore.data.map { preferences -> - preferences[USER_NAME_KEY] ?: "" - } - - val privateKeyFlow: Flow = dataStore.data.map { preferences -> - preferences[PRIVATE_KEY] ?: "" - } - private val _tabIndex = mutableIntStateOf(0) val tabIndex: State = _tabIndex + // val videos = mutableStateListOf