首页 > 解决方案 > 绕过 Kotlin “预期的属性获取器或设置器”

问题描述

我需要创建一个私有字段并使用它而无需从其他类访问它。但我不能在构造函数中实例化它。我正在为 Android 开发,并且无法以这种方式实例化有问题的字段 screenWakeLocker:

class MainActivity : AppCompatActivity() {
private val screenWakeLocker: PowerManager.WakeLock = 
                            (getSystemService(Context.POWER_SERVICE) as PowerManager)
                            .newWakeLock(PowerManager.FULL_WAKE_LOCK, "")

“系统服务在 onCreate() 之前对活动不可用”

所以我在 OnCreate 中实例化它:

class MainActivity : AppCompatActivity() {
private var game: Game = Game()
private var screenWakeLocker?: PowerManager.WakeLock;

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    screenWakeLocker = (getSystemService(Context.POWER_SERVICE) as PowerManager).newWakeLock(PowerManager.FULL_WAKE_LOCK, "")
}

override fun onResume(){
    super.onResume()
    screenWakeLocker.acquire()
}

并在 ?: PowerManager.WakeLock 处得到一个编译错误“Property getter or setter expected”

如何使它对其他类不可用并使用它?

标签: androidkotlin

解决方案


你有两个选择:

  1. 选项一,如果你想使用“var”,你可以添加lateinit
  2. 选项二,您可以通过 lazy使用,在需要时初始化对象

    private lateinit var screenWakeLocker: PowerManager.WakeLock
    private val screenWakeLockerTwo by lazy {(getSystemService(Context.POWER_SERVICE) as PowerManager).newWakeLock(PowerManager.FULL_WAKE_LOCK, "")}
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        screenWakeLocker = (getSystemService(Context.POWER_SERVICE) as PowerManager).newWakeLock(PowerManager.FULL_WAKE_LOCK, "")
    }`
    

我认为选项二更好。


推荐阅读