问题描述
我有一个类,我将其注入到ViewModel + ViewModel工厂中,当在活动中的onCreate方法中初始化视图模型时,它说正在传递的值未初始化.
I have a class which i inject into a ViewModel + ViewModel factory, when initialise the view model in the onCreate method in activity, its says the value being passed through is not initialised.
下面是我的代码
我对Kotlin还是很陌生,所以尝试了调试,但在此问题上陷入了困境.
I am quite new to Kotlin so have tried debugging but am stuck on this issue.
这是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
}
}
我的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")
}
}
我的班级回购:
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)
}
}
这是我收到的错误:
Unable to start activity ComponentInfo{com.carllewis14.repos/com.carllewis14.repos.ui.MainActivity}: kotlin.UninitializedPropertyAccessException: lateinit property
repository has not been initialized
推荐答案
在这里查看我的答案(也许有帮助)
have a look at my answer here (maybe it helps ) Nullable var with `?` vs. lateinit var
本质上,您永远不会初始化repository: RepoRepository
.
Essentially, you are never initializing your repository: RepoRepository
.
根据您编写的代码,您也无需在活动中使用存储库实例,而只需在ViewModel
(具有注入功能)的构造函数中创建
From the code you have written, you won't need an instance of your repository in your activity as well, it should just be created in the constructor of your ViewModel
(which has injection)
您还将在private lateinit var repoService: GithubRepos
中遇到类似的问题;如果它在对象的构造函数中,则无需再次声明.
You are also going to have a similar issue with private lateinit var repoService: GithubRepos
; if it's in the constructor of your object, you don't have to declare it again.
这篇关于UninitializedPropertyAccessException:lateinit属性尚未初始化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!