0

我不确定我的情况是否无法使用后期初始化属性。但是让我问一下:)

我有一个几乎在每个活动中都使用的 applicationController - 所以我创建了一个BaseActivity

现在的问题是,当我想从子活动中的应用程序控制器获取依赖项时,我得到了一个未初始化的异常

谢谢你的帮助!

4

1 回答 1

4

因为您覆盖了错误的方法BaseActivity,这就是您的应用程序崩溃的原因。

解决方案:将代码更改为

abstract class BaseActivity : AppCompatActivity() {

    lateinit var applicationController: ApplicationController

    // [IMPORTANT] Remove or comment-out this method
//    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
//        super.onCreate(savedInstanceState, persistentState)
//        applicationController = ApplicationController.getInstance(applicationContext)
//    }

    // Override this method
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        applicationController = ApplicationController.getInstance(applicationContext)
    }
}

说明:本节将解释代码不工作的原因。

kotlin.UninitializedPropertyAccessException

这是RuntimeException的一个子类,当你在初始化之前通过自己调用属性或方法来访问一个对象时,应用程序会抛出这个异常。

创建LoginScreen活动时,Android 将调用其onCreate方法。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    setContentView(R.layout.activity_login_screen)

    emailMatcher = applicationController.getEmailMatcher()
    passwordMatcher = applicationController.getPasswordMatcher()
}

第一行将super.onCreate(savedInstanceState)调用onCreate其父级的方法,在这种情况下onCreate (bundle)BaseActivity调用活动中的方法。

不幸的是,在BaseActivity活动中,您覆盖并将初始代码applicationController放在另一个onCreate(bundle, persistentState)onCreate (bundle). 它们之间的区别在于参数的数量。结果,此时applicationController还没有初始化。

override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
    super.onCreate(savedInstanceState, persistentState)
    applicationController = ApplicationController.getInstance(applicationContext)
}

直到应用到达这条线

emailMatcher = applicationController.getEmailMatcher()

因为您getEmailMatcher在未初始化的对象上调用方法applicationController,所以应用程序抛出kotlin.UninitializedPropertyAccessException并使您的应用程序崩溃。

于 2019-03-05T08:50:59.797 回答