【发布时间】:2022-05-02 22:43:13
【问题描述】:
我有一个名为 ParentScreen 的组合和一个名为 ParentViewModel 的 ViewModel。在 ParentViewModel 中,我正在从我的 repo 中收集一个值。
class MyRepo @Inject constructor() {
fun getParentData() = System.currentTimeMillis().toString() // some dummy value
}
@HiltViewModel
class ParentViewModel @Inject constructor(
myRepo: MyRepo
) : ViewModel() {
private val _parentData = MutableStateFlow("")
val parentData = _parentData.asStateFlow()
init {
val realData = myRepo.getParentData()
_parentData.value = realData
}
}
@Composable
fun ParentScreen(
parentViewModel: ParentViewModel = hiltViewModel()
) {
val parentData by parentViewModel.parentData.collectAsState()
ChildWidget(parentData = parentData)
}
在ParentScreen 可组合对象中,我有一个ChildWidget 可组合对象,它有自己的ViewModel,名为ChildViewModel。
@HiltViewModel
class ChildViewModel @AssistedInject constructor(
@Assisted val parentData: String
) : ViewModel() {
@AssistedFactory
interface ChildViewModelFactory {
fun create(parentData: String): ChildViewModel
}
init {
Timber.d("Child says data is $parentData ")
}
}
@Composable
fun ChildWidget(
parentData: String,
childViewModel: ChildViewModel = hiltViewModel() // How do I supply assisted injection factory here?
) {
// Code omitted
}
现在,我想在ChildViewModel 的构造函数中获取parentData。
问题
- 如何将
ChildViewModelFactory提供给 Navigation Compose 的hiltViewModel方法? - 如果这不可能,那么将对象从父可组合注入到子可组合的
ViewModel的最合适方法是什么?像下面这样创建一个lateinit属性和init方法怎么样?
@HiltViewModel
class ChildViewModel @Inject constructor(
) : ViewModel() {
lateinit var parentData: Long
fun init(parentData: Long){
if(this::parentData.isInitialized) return
this.parentData = parentData
}
}
【问题讨论】:
-
我真的很想从未来的答案中学习。就个人而言,我在最近的项目中从 Compose 开始,我发现将一个 ViewModel 保留在父级要容易得多。如果子可组合中有任何数据并希望将其打包传递给父级,我只需使用 Unit 类型参数返回相同的数据。我不确定,如果我的方式是正确的,我很想看到答案。
-
@Abdullah 在这种情况下,您可以对此问题进行投票并关注 以获取更新,评论不会订阅您的答案。
-
错过了????.
标签: android kotlin android-jetpack-compose dagger-hilt navigation-compose