Search code examples
androidkotlinandroid-viewmodeldagger-hilt

Can't see DI outside of init block of ViewModel


I'm trying to control ViewModel from a fragment by sending category_id and pass it to the repository which is injected by Hilt. But ViewModel cant see repository outside of init block. What did I miss?

@HiltViewModel
class ProjectViewModel @Inject constructor(
repository: ScienceTrackerRepository
) : ViewModel() {

private val _flow = MutableStateFlow(LoadUiState.Success(emptyList()))
val flow: StateFlow<LoadUiState> = _flow.asStateFlow()

fun loadProjects(categoryId: Int) {
    viewModelScope.launch {
        repository.getProjects(categoryId) // unresolved reference "repository"
        repository.flowProjects.collect { feed ->
            _flow.value = LoadUiState.Success(feed)
        }
    }
}

init {
    viewModelScope.launch {
        repository.getProjects(0) 
        repository.flowProjects.collect { feed ->
            _flow.value = LoadUiState.Success(feed)
        }
    }
}
}

Solution

  • you need to add var or val keyword like this:

    @HiltViewModel class ProjectViewModel @Inject constructor( val repository: ScienceTrackerRepository ) : ViewModel() {

    }

    to access the constructor params outside the init block.