在Jetpack Compose中将CompositionLocal值传递给视图模型的干净方法



我必须根据storeURL和产品的SKU加载评论。对于SKU,我打一个网络电话,在MutableFlow中获取产品。storeURL位于compositionLocal中。现在,我如何将这个storeURL从composition local传递到viewModel。

这是在viewModel 中加载评论的功能

fun loadReviews(products: List<Storefront.Product>?, storeUrl: String) {
viewModelScope.launch(Dispatchers.IO) {
when (val result = getReviews(products, storeUrl)) {
is Resource.Loading -> Unit
is Resource.Success -> {
val data = result.data
data.whatIfNotNull {
reviews.value = it
}
}
is Resource.Error -> Unit
}
}
}

这就是我想在init块中做的事情

init {
viewModelScope.launch {
productsList.collectLatest { products ->
loadReviews(products, [HOW TO GET STORE URL FROM COMPOSITION LOCAL HERE])
}
}
}

有多种方法。对于初学者,您可以避免在init中启动productsList,而是使用一个从LaunchedEffect调用的函数来启动它。

@Composable fun ProductScreen(viewModel: ProductViewModel) {
val compositionStuff = Whatever.current
LaunchedEffect(Unit) { viewModel.loadProducts(compositionStuff) }
}

或者,您可以在ViewModel中包含一个SavedStateHandle作为参数,并且在实例化ViewModel时(使用Hilt(确保它的范围正确,以便将导航参数传递给它

composable("/products/{storeUrl}") {
val vm = hiltViewModel<ProductViewModel>(it)
ProductScreen(vm)
}
@HiltViewModel
class ProductViewModel @Inject constructor(
savedStateHandle: SavedStateHandle,
) : ViewModel () {
private val storeUrl: String = savedStateHandle["storeUrl"]!!
init { loadProducts(products, storeUrl) }
}

最新更新