kotlin 如何在Jetpack合成中列出API调用结果

9rnv2umw  于 2023-01-21  发布在  Kotlin
关注(0)|答案(1)|浏览(178)

我正在尝试建立一个简单的列表应用程序,并使用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())
    }

}
szqfcxe2

szqfcxe21#

observeAsState不会返回一个LiveData;它会返回你所观察到的LiveData中包含的数据。
每当LiveData的值发生变化时,就会触发重新组合,您将获得一个新值。
将属性carsLiveData的名称更改为cars,您可以直接将其用作LazyColumn中的项。
还有一点需要注意--每次CarsScreen可组合文件被重新组合时,你都在里面调用viewModel.getCarsFromAPI(),你可能不想这么做。
如果你只想获得一次列表,你可以在CarsScreen中使用一个LaunchedEffect,类似于:

// Copyright 2023 Google LLC.
// SPDX-License-Identifier: Apache-2.0

@Composable
fun CarsScreen(...) {
    LaunchedEffect(Unit) {
        viewModel.getCarsFromAPI()
    }
    ...
}

如果你想更新这个列表,把一些状态传递给LaunchedEffect而不是Unit --只要状态改变,LaunchedEffect就会被取消(如果当前正在运行)并重新启动。

相关问题