5

我有一个可组合的 callParentScreen和一个ViewModelnamed 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
}

现在,我想进入parentDataChildViewModel构造函数。

问题

  • 我如何提供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
    }
}
4

0 回答 0