Как правильно отобразить список из View Model Stateflow в композитном?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как правильно отобразить список из View Model Stateflow в композитном?

Сообщение Anonymous »

Я создал проект Compose, который следует за стандартной архитектурой проекта. Он имеет класс данных, интерфейс, класс API, репозиторий. Репозиторий подключен к ViewModel, и это, в свою очередь, получено в композитном. Моя цель очень проста, я добавил некоторые местоположения в базе данных Postgres, очень простые с идентификатором, именем, LNG, LAT. правильно из API. Но я столкнулся с проблемой, она не отображает список локаций в композиционном. Может ли кто -нибудь объяснить мне, почему это? = "https://i.sstatic.net/7obqhjke.png"/>
Я испортился с ViewModel и экраном, но без успеха в выяснении ошибки.
Я создал частный val: < /p>
// Location data
private val _selectedLocations = MutableLiveData(null)
val selectedLocations: LiveData = _selectedLocations
< /code>
Я создал новый экран, который вызывает местоположения: < /p>
@OptIn(ExperimentalLayoutApi::class)
@Composable
fun LocationScreens(
locationsHiltViewModel: LocationsHiltViewModel,
) {

var loadingAnim by remember { mutableStateOf(false) }
val locationData = selectedLocations.value

locationData?.let { existingLocation ->
locationsHiltViewModel.locations.collectAsState(initial = NetworkResult.Loading).value.let { response ->
when(response) {
is NetworkResult.Loading -> {
loadingAnim = true
}
is NetworkResult.Success -> {
loadingAnim = false

Locations(
locationData = LocationData()
)
}
is NetworkResult.Error -> {
loadingAnim = false
Toast.makeText(
LocalContext.current,
response.message,
Toast.LENGTH_LONG
).show()
}
}
}
LoadingAnim(loadingAnim)
} ?: run {
NoLocationsMatch()
}

}
< /code>
locationshiltviewmodel: извлекает все данные из репо! < /p>
@HiltViewModel
class LocationsHiltViewModel @Inject constructor(
private val repo: Repo
) : ViewModel() {

private val _locations = MutableStateFlow(NetworkResult.Loading)
val locations : StateFlow get() = _locations

init {
fetchLocations()
}

fun fetchLocations() {
viewModelScope.launch {
try {
_locations.value = NetworkResult.Loading
val response = repo.getLocationData()

if (response.isSuccessful) {
response.body()?.let { locations ->
_locations.value = NetworkResult.Success(locations)
} ?: run {
_locations.value = NetworkResult.Success(listOf())
Log.d("Locations 1", "Response body is null")
}
} else {
_locations.value = NetworkResult.Error(response.message())
Log.d("Locations 2", "Error: ${response.code()} ${response.message()}")
}
} catch (e: Exception) {
_locations.value = NetworkResult.Error(e.message.toString())
Log.d("Location 3", "Exception: ${e.message.toString()}")
}
}
}
}
< /code>
locationscreen: < /p>
@Composable
fun Locations(
locationData: LocationData?
) {

Box(
modifier = Modifier
.fillMaxSize()
.background(Color.Black)

) {
Box(
modifier = Modifier
.fillMaxWidth()
.background(Color.Black)
.padding(top = 30.dp)
) {
Column(
modifier = Modifier
.padding(10.dp)
.fillMaxWidth()
.background(Color.Black)

) {

LazyVerticalGrid(
columns = GridCells.Fixed(2), // 2 columns in the grid
modifier = Modifier.fillMaxSize(),
contentPadding = PaddingValues(8.dp)
) {

locationData?.let { location ->
items(3) {
LocationItems(
id = location.id,
locationName = location.locationname,
lng= location.lng,
lat= location.lat

)
}
}
}

}
}
}

}

@Composable
private fun LocationItems(
id: Int?,
locationName: String?,
lng: Double?,
lat: Double?,
) {
Box(
modifier = Modifier
.padding(10.dp)
.fillMaxWidth()
.background(Color.Black, shape = RoundedCornerShape(12.dp))
.padding(10.dp),
contentAlignment = Alignment.CenterStart
) {
Column(
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.Start
) {
id?.let { Text(text = "ID: $it") }
locationName?.let { Text(text = "Location Name: $it") }
lng?.let { Text(text = "lng: $it") }
lat?.let { Text(text = "lat: $it") }

}
}
}


Подробнее здесь: https://stackoverflow.com/questions/794 ... composable
Ответить

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

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

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

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

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