UninitializedPropertyAccessException:lateinit 属性尚未初始化

Dan*_*Yon 18 android kotlin dagger-2

我有一个类,我将它注入到 ViewModel + ViewModel 工厂中,当在活动的 onCreate 方法中初始化视图模型时,它表示传递的值未初始化。

下面是我的代码

我对 Kotlin 很陌生,所以尝试过调试,但被困在这个问题上。

这是 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
     }
    }
Run Code Online (Sandbox Code Playgroud)

我的 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")

    }


   }
Run Code Online (Sandbox Code Playgroud)

我的类回购:

  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)
    }
   }
Run Code Online (Sandbox Code Playgroud)

这是我收到的错误:

   Unable to start activity ComponentInfo{com.carllewis14.repos/com.carllewis14.repos.ui.MainActivity}: kotlin.UninitializedPropertyAccessException: lateinit property 
  repository has not been initialized
Run Code Online (Sandbox Code Playgroud)

COR*_*ian 25

这是因为您在使用实例初始化之前尝试使用存储库,而不检查其初始化。

使用lateinit null 时不能在该变量中使用。

lateinit var repository: RepoRepository

然后,在使用对象的任何方法之前,检查它是否已初始化:

if (::repository.isInitialized) {}

GL

  • 可空类型不允许 Lateinit (3认同)

Mir*_*dil 6

如果您使用 Kotlin 1.2,您可以轻松检查 Lateinit 变量是否已初始化。如果没有,那么您始终可以使用非空方法。

无论如何,您可以通过以下方法检查 Lateinit var 是否已初始化:

if (::fullName.isInitialized) {
    print("Hi, $fullName")
}
Run Code Online (Sandbox Code Playgroud)


a_l*_*ody 4

看看我在这里的答案(也许有帮助)Nullable var with `?` 与 Lateinit var

本质上,您永远不会初始化您的repository: RepoRepository.

从您编写的代码来看,您的活动中也不需要存储库的实例,它应该只在您的构造函数中创建ViewModel(具有注入)

您也会遇到类似的问题private lateinit var repoService: GithubRepos;如果它在对象的构造函数中,则不必再次声明它。