android - 在 Kotlin 中的原始类型属性上不允许使用 lateinit 修饰符

我在 kotlin 中定义为一个实例变量,并希望将其初始化为 activityonCreate 方法。

var count: Int
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    count.inc()
}

在这里,我在计数变量上收到以下错误。

Property must be initialized or be abstract in Kotlin

嗯,我读了这篇文章 Property must be initialized or be abstract并尝试了同样的方法,但我再次收到以下错误。

lateinit modifier is not allowed on primitive type properties

lateinit var count: Int
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    count.inc()
}

有没有办法在 Kotlin 中做到这一点?

最佳答案

有几种方法可以解决此问题。

您可以使用默认值(例如 0-1 或其他)对其进行初始化,然后在您的逻辑说明时对其进行初始化。

或者告诉编译器稍后将在此代码中使用 Delegates.notNull check notNull 来初始化计数.

var count: Int by Delegates.notNull<Int>()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // You can not call `Int.inc()` in onCreate()` function until `count` is initialised.
    // count.inc()
    // **initialise count** 
}

如果你需要按需计数值(如果不需要在onCreate中初始化),你可以使用lazy函数。仅当您想要on demand 执行密集(一些计算/扩展布局等)任务时才使用此选项,而不仅仅是分配一个值。

var count:Int by lazy {
    // initialise
}

现在你可以决定使用什么了。

希望对你有帮助。

https://stackoverflow.com/questions/44381791/

相关文章:

java - 如何将 Java 赋值表达式转换为 Kotlin

spring - Kotlin 和 Spring Boot @ConfigurationProper

android - 在 android studio 中运行带有 main 函数的单个 kotlin

kotlin - 字符串插值在 Kotlin 中是如何工作的?

string - Kotlin 多行字符串中的模板转义

android - 无法获取提供商 com.google.android.gms.ads.Mobil

java - Android Studio 3.1.3 - Unresolved reference

list - 在 Kotlin 中,如何在迭代时修改列表的内容

android - Kotlin 等价于 Java 的 equalsIgnoreCase

android - Dagger 2 与 Kotlin 的多重绑定(bind)