[optimize] Optimize the video list loading logic to avoid duplicate loading and list mixing

This commit is contained in:
acite
2025-08-27 01:50:53 +08:00
parent fc76e6995f
commit 55fda08e06
2 changed files with 28 additions and 46 deletions

View File

@@ -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<String> = dataStore.data.map { preferences ->
preferences[USER_NAME_KEY] ?: ""
}
val privateKeyFlow: Flow<String> = dataStore.data.map { preferences ->
preferences[PRIVATE_KEY] ?: ""
}
private val _tabIndex = mutableIntStateOf(0)
val tabIndex: State<Int> = _tabIndex
// val videos = mutableStateListOf<Video>()
// private val _klasses = MutableStateFlow<List<String>>(emptyList())
var classes = mutableStateListOf<String>()
val classesMap = mutableStateMapOf<String, SnapshotStateList<Video>>()
val videos = mutableStateListOf<Video>()
private val _klasses = MutableStateFlow<List<String>>(emptyList())
val klasses: StateFlow<List<String>> = _klasses;
var imageLoader: ImageLoader? = null;
@Composable
@@ -62,10 +46,14 @@ class VideoScreenViewModel(application: Application) : AndroidViewModel(applicat
}
suspend fun init() {
_klasses.value = MediaManager.listVideoKlasses()
classes.addAll(MediaManager.listVideoKlasses())
for(it in classes)
{
classesMap[it] = mutableStateListOf<Video>()
}
MediaManager.listVideos(_klasses.value.first()){
v -> if(0 == tabIndex.value && !videos.contains(v)) videos.add(videos.size, v)
MediaManager.listVideos(classes[0]){
v -> classesMap[classes[0]]?.add(v)
}
}
@@ -75,10 +63,9 @@ class VideoScreenViewModel(application: Application) : AndroidViewModel(applicat
{
_tabIndex.intValue = index;
videos.clear()
MediaManager.listVideos(_klasses.value[index])
MediaManager.listVideos(classes[index])
{
v -> if(index == tabIndex.value) videos.add(videos.size, v)
v -> classesMap[classes[index]]?.add(v)
}
}
}