尝试在@Composable中获取ViewModel



我正在学习喷气背包作曲。我坚持使用ViewModels。

我有一个ViewModel

class DataViewModel: ViewModel() {
//the list of live data
var listData = mutableListOf<Data>()
//initialize the viewmodel
init {
viewModelScope.launch {
//do the network call (this is working ok)
val data = fetchData()
data.forEach {
listData.add(it)
//print the list of data, this is working fine
println("listData")
}
}
}

所以获取数据并把它放在数据列表中工作得很好。但是不,我想在屏幕上显示数据。我做了一个可组合的

@Composable
//pass in the viewmodel
fun DataScreen(model:DataViewModel = viewModel()){
println("model.listData")
this return an empty list ?
Column{
model.listData?.forEach { item ->
Text("${item}")
}
}
}

在我的屏幕上什么也没有发生,因为它是一个空列表在可组合。如何从ViewModel中获取列表?

问题是你没有使用State值在视图模型中。为了注册可组合重组的值(如果值被分配/更改),需要State

所以你需要有这样的视图模型(我猜你的fetchData是一个暂停函数):

class DataViewModel: ViewModel() {
//the list of live data
val listDataState = MutableState<List<Data>> =  mutableStateOf(emptyList<Data>())
//initialize the viewmodel
init {
viewModelScope.launch {
val data = fetchData()
listDataState.value = data
}
}
suspend fun fetchData() : List<Data>{
//something like: 
return dataRepository.getData()
}
}

然后在你的@Composable函数中你得到这样的数据:

val viewModel: DataViewModel = viewModel()
val data = viewModel.listDataState.value

目前我在我的项目中使用这种方式

PokemonDetailScreen.kt

@Composable
fun PokemonDetailScreen(
dominantColor : Color,
pokemonName : String,
navController : NavController,
topPadding : Dp = 20.dp,
pokemonImageSize : Dp = 200.dp,
viewModel : PokemonDetailVm = hiltViewModel()
){
}

PokemonDetailVm.kt

@HiltViewModel
class PokemonDetailVm @Inject constructor(
private val repository: PokemonRepositoryFeature
): ViewModel(){
suspend fun getPokemonInfo(pokemonName:String): Resource<Pokemon>{
return repository.getPokemonInfo(pokemonName)
}
}

//Dagger - Hilt
implementation "com.google.dagger:hilt-android:2.44"
kapt "com.google.dagger:hilt-compiler:2.44"
kapt "com.google.dagger:hilt-android-compiler:2.44"
implementation 'androidx.hilt:hilt-navigation-compose:1.1.0-alpha01'

不将viewModel传递给fun datasscreen。你可以使用下面的有趣的datasscreen -

val viewModel = viewModel<DataViewModel>()

要使其工作,在应用构建中添加下面的依赖项。gradle——

implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1'

现在你可以使用viewModel.listData。

相关内容

  • 没有找到相关文章

最新更新