我正在尝试建立一个简单的列表应用程序,并使用retrofit2从url获取数据。然后,我存储在MutableLiveData对象中。我如何在LazyColumn中列出retrofit2结果?
我的作文:
@ExperimentalAnimationApi
@Composable
fun CarsScreen(
viewModel: CarListViewModel = hiltViewModel()
){
viewModel.getCarsFromAPI()
val carsLiveData = viewModel.carsLiveData.observeAsState()
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp),
){
GreetingSection()
}
LazyColumn(
modifier = Modifier.fillMaxSize(),
) {
itemsIndexed( ){
//TODO
}
}
}
视图模型:
@HiltViewModel
class CarListViewModel @Inject constructor(
private val carRepository: CarRepository
): ViewModel() {
val carsLiveData:MutableLiveData<Resource<CarsResponse>> = MutableLiveData()
fun getCarsFromAPI() = viewModelScope.launch {
carsLiveData.postValue(Resource.Loading())
val response = carRepository.getCarsFromAPI()
carsLiveData.postValue(handleCarResponse(response))
}
private fun handleCarResponse(response: Response<CarsResponse>) : Resource<CarsResponse> {
if(response.isSuccessful){
response.body()?.let{resultResponse ->
return Resource.Success(resultResponse)
}
}
return Resource.Error(response.message())
}
}
1条答案
按热度按时间szqfcxe21#
observeAsState
不会返回一个LiveData
;它会返回你所观察到的LiveData
中包含的数据。每当
LiveData
的值发生变化时,就会触发重新组合,您将获得一个新值。将属性
carsLiveData
的名称更改为cars
,您可以直接将其用作LazyColumn
中的项。还有一点需要注意--每次
CarsScreen
可组合文件被重新组合时,你都在里面调用viewModel.getCarsFromAPI()
,你可能不想这么做。如果你只想获得一次列表,你可以在
CarsScreen
中使用一个LaunchedEffect
,类似于:如果你想更新这个列表,把一些状态传递给
LaunchedEffect
而不是Unit --只要状态改变,LaunchedEffect
就会被取消(如果当前正在运行)并重新启动。