Tengo un componente llamado ParentScreen y un ViewModel llamado ParentViewModel . Dentro de ParentViewModel , estoy recopilando un valor de mi repositorio.
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) } Dentro de la composición de ParentScreen , tengo una composición de ChildWidget y tiene su propio ViewModel llamado 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 } Ahora, quiero obtener parentData dentro del constructor de ChildViewModel .
Preguntas
ChildViewModelFactory al método hiltViewModel de Navigation Compose?ViewModel del componible secundario? ¿Qué tal crear una propiedad lateinit y un método init como se muestra a continuación? @HiltViewModel class ChildViewModel @Inject constructor( ) : ViewModel() { lateinit var parentData: Long fun init(parentData: Long){ if(this::parentData.isInitialized) return this.parentData = parentData } }