В настоящее время я изучаю Jetpack Compose и пытаюсь реализовать индикатор загрузки во время загрузки данных.
Я управляю состоянием пользовательского интерфейса с помощью управления состоянием (StateFlow/MutableStateFlow). Моя цель — показать загрузчик во время загрузки данных и отобразить содержимое после загрузки данных.
Однако загрузчик не отображается во время загрузки данных.
Как правильно управлять состоянием, чтобы загрузчик отображался во время процесса загрузки, а пользовательский интерфейс правильно обновлялся после того, как данные стали доступны?
Модернизация
object FakeApiClient {
val apiService: GetDataService by lazy {
object : GetDataService {
override suspend fun getData(): List {
delay(2.seconds)
return List(100) { UserDataModel("User #$it", "$it", "user$it@example.com") }
}
}
}
}
interface GetDataService {
@GET("users")
suspend fun getData() : List
}
class UserRepository(val api: GetDataService) {
suspend fun getUser() : List {
return api.getData()
}
}
@Composable
fun HomeScreen(modifier: Modifier,viewModel: HomeViewModel = viewModel())
{
val users = viewModel.uiState.collectAsState().value
when(users)
{
is HomeUIState.Loading -> {
CircularProgressIndicator()
}
is HomeUIState.NoData -> {
Text("No data found")
}
is HomeUIState.Error -> {
val errormsg = users.error
Text(errormsg)
}
is HomeUIState.Success ->{
val list = users.list
Column() {
LazyColumn() {
items(list.size) { index ->
Text(list[index].name)
}
}
}
}
}
}
class HomeViewModel( val userRepo : UserRepository = UserRepository(FakeApiClient.apiService)) : ViewModel() {
private val _uiState = MutableStateFlow(HomeUIState.Loading)
val uiState : StateFlow = _uiState
private val _uiString = MutableStateFlow("")
val uiString : StateFlow = _uiString
init {
loadData()
}
private fun loadData() {
viewModelScope.launch{
_uiState.value = HomeUIState.Loading
try {
val users = userRepo.getUser()
if(users.isEmpty())
{
_uiState.value = HomeUIState.NoData
}
else{
_uiState.value = HomeUIState.Success(users)
}
} catch (e: Exception) {
_uiState.value = HomeUIState.Error(e.localizedMessage ?: "Something went wrong")
}
}
}
}
data class UserDataModel(val name : String,val username : String, val email : String)
sealed interface HomeUIState {
data object Loading : HomeUIState
data object NoData : HomeUIState
data class Success(val list: List) : HomeUIState
data class Error(val error: String) : HomeUIState
}
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.okhttp3:okhttp:4.9.0")
implementation("com.squareup.okhttp3:logging-interceptor:4.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2")
testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3")
testImplementation("io.mockk:mockk:1.13.8")
Подробнее здесь: https://stackoverflow.com/questions/799 ... e-state-ma