В настоящее время я изучаю 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
Индикатор загрузки не отображается при загрузке данных в Jetpack Compose (управление состоянием) ⇐ Android
Форум для тех, кто программирует под Android
1772912357
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")
Подробнее здесь: [url]https://stackoverflow.com/questions/79902935/loading-indicator-is-not-showing-while-loading-data-in-jetpack-compose-state-ma[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия