Индикатор загрузки не отображается при загрузке данных в Jetpack Compose (управление состоянием)Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Индикатор загрузки не отображается при загрузке данных в Jetpack Compose (управление состоянием)

Сообщение Anonymous »

В настоящее время я изучаю 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»