我有一个可组合的 callParentScreen
和一个ViewModel
named ParentViewModel
。在里面ParentViewModel
,我正在从我的回购中收集一个价值。
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
}
现在,我想进入parentData
的ChildViewModel
构造函数。
问题
- 我如何提供
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
}
}