J'ai une classe que j'injecte dans une fabrique ViewModel + ViewModel, lors de l'initialisation du modèle de vue dans la méthode onCreate en activité, il indique que la valeur transmise n'est pas initialisée.
Ci-dessous mon code
Je suis assez nouveau pour Kotlin, j'ai donc essayé le débogage mais je suis bloqué sur ce problème.
Voici le code MainActivity:
class MainActivity: AppCompatActivity(), RepoSelectedListener {
@Inject
lateinit var viewModel: MainActivityListViewModel
lateinit var lifecycleOwner: LifecycleOwner
lateinit var repoSelectedListener: RepoSelectedListener
@Inject
lateinit var repository: RepoRepository
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel = ViewModelProviders.of(this, ViewModelFactory(repository)).get(MainActivityListViewModel::class.Java)
repoRecyclerView.apply {
layoutManager = LinearLayoutManager(context)
adapter = RepoListAdapter(viewModel, lifecycleOwner, repoSelectedListener)
}
**My ViewModel:**
class MainActivityListViewModel @Inject constructor(val
repoRepository: RepoRepository): BaseViewModel() {
//private lateinit var repoRepository: RepoRepository
private var disposable: CompositeDisposable? = null
private val repos = MutableLiveData<List<Repo>>()
private val repoLoadError = MutableLiveData<Boolean>()
private val loading = MutableLiveData<Boolean>()
init {
disposable = CompositeDisposable()
fetchRepos()
}
fun getRepos(): LiveData<List<Repo>> {
return repos
}
}
mon ViewModelFactory:
class ViewModelFactory @Inject constructor(private val
repoRepository: RepoRepository): ViewModelProvider.Factory{
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if
(modelClass.isAssignableFrom(MainActivityListViewModel::class.Java))
{
@Suppress("UNCHECKED_CAST")
return MainActivityListViewModel(this.repoRepository) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
mon repo de classe:
class RepoRepository @Inject constructor(private val githubRepos:
GithubRepos){
private lateinit var repoService: GithubRepos
fun getRepositories(): Single<List<Repo>> {
return repoService.getRepos()
}
fun getSingleRepo(owner: String, name: String): Single<Repo> {
return repoService.getSingleRepo(owner, name)
}
}
C'est l'erreur que je reçois:
Unable to start activity ComponentInfo{com.carllewis14.repos/com.carllewis14.repos.ui.MainActivity}: kotlin.UninitializedPropertyAccessException: lateinit property
repository has not been initialized
il semble que le code de la question soit l'injection FYI que vous pouvez également initialiser par paresseux:
Pour créer un objet qui sera initialisé lors du premier accès, nous pouvons utiliser la méthode paresseuse:
val lazyValue: ClassWithHeavyInitialization by lazy {
numberOfInitializations.incrementAndGet()
ClassWithHeavyInitialization()
}
https://www.baeldung.com/kotlin-lazy-initialization voir aussi la documentation de kotlin