android - 绕过 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”
如何使它对其他类不可用并使用它?
解决方案
你有两个选择:
- 选项一,如果你想使用“var”,你可以添加lateinit
选项二,您可以通过 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, "") }`
我认为选项二更好。
推荐阅读
- java - 如何保存将指向另一个表中的外键条目的对象?
- php - PHPmailer 发送带附件的电子邮件
- python - 使用 python 运行 bash 脚本
- mysql - 如何将此 MySQL 查询转换为 Eloquent?
- ruby - 从句子中删除否定词
- node.js - 在请求完成之前进程退出
- firebase - Firebase 函数本地“文件:”依赖项
- regex - 使用正则表达式限制字符数
- extjs - 如何在 extjs 中的按钮单击事件上隐藏/显示日期组件?
- dataframe - Pyspark:序列化任务超过允许的最大值。考虑增加 spark.rpc.message.maxSize 或对大值使用广播变量