问题标签 [kotlin-lateinit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - 重新创建 Activity 时未初始化 lateinit 属性
在我的活动中,我有一个lateinit
名为controller
我的片段使用的属性。此属性在 中初始化Activity.onCreate()
。myFragment
将其引用返回到 my Activity
through onAttach()
。然后Fragment
调用。myActivity.controller
_Fragment.onCreate()
通常controller
首先在 中初始化Activity.onCreate()
,然后Fragment
添加 。所以这很好用。
但是当 myActivity
被杀死时,它会尝试重新创建自己及其碎片。这导致在初始化发生之前Fragment.onCreate()
被调用。Activity.onCreate()
这些是我现在看到的选项:
controller
之前初始化super.onCreate()
(如果可能的话)- 将调用移至
myActivity.controller
稍后的生命周期回调,如onViewCreated()
::controller.isInitialized
Kotlin 1.2中可用的东西
我在这里最好的选择是什么?
kotlin - 关键字lateinit 是不必要的吗?
我正在学习 Kotlin,读到这个lateinit
关键字让我怀疑它的用处。考虑这段代码:
这里获取字符串长度的唯一区别是使用?.
运算符检查它是否为空。在访问属性或调用方法时是否使用了lateinit
不必添加额外问号的快捷方式?就这一事实而言,我认为添加额外的问号比访问异常时更值得lateinit
。
更多的研究表明,这lateinit
对于变量尚未初始化的注入和/或单元测试很有用,但它会。但是,难道不值得拥有额外的东西?.
而不是.
不冒例外的风险吗?
android - Kotlin:lateinit 到 val,或者,可以设置一次的 var
只是好奇:在 Kotlin 中,我很想得到一些可以由惰性初始化但带有参数的 val。那是因为我需要一些很晚才创建的东西来初始化它。
具体来说,我希望我有:
或者:
接着:
或在第二种情况下controlObj.initWith(view)
或类似的情况下:
我不能使用by lazy
,因为by lazy
在初始化时不接受要使用的外部参数。在这个例子中 - 包含view
.
当然我有lateinit var
,但如果我能确保它在设置后变为只读并且我可以在一行中完成它会很好。
有没有一种非常干净的方法来创建一个只读变量,它只初始化一次,但只有在其他一些变量诞生时才初始化?init once
有关键字吗?在init之后编译器知道它是不可变的吗?
我知道这里潜在的并发问题,但如果我敢在 init 之前访问它,我当然应该被抛出。
java - 使用 Mybatis 时无法在 servicePackage 中使用 userMapper.kt(interface)
虽然我已经标记了'lateinit',但它仍然没有初始化。是个鬼虫,昨晚一切正常,今天不行了,好累在这里输入图片描述
kotlin - 为什么 lateinit 不能与 elvis 运算符一起使用,以及它与可选项的具体不同之处
假设我有以下课程:
产生以下警告:
然后是以下运行时异常:
因此,在我的理解中,可选可以是一种类型,也可以是任何时候的 null,而lateinit
变量可以是 null,直到它被赋予一个值,然后再也不能为 null,并且必须被赋予一个值。但是很明显,语义lateinit
略有不同。
那么:lateinit
为什么它不是 falsy 的起始值是多少?是否可以以lateinit
这种方式使用,作为可选的替代品?如果没有,我该如何创造这种价值?(允许 null 作为起始状态,但随后不可为 null)
kotlin - 访问 Companion 类中的 lateinit 变量
我有以下代码:
由于某种原因,它编译得很好。在运行时,当应用程序在设备上启动时,会引发此异常:
java.lang.NoSuchFieldError:没有 Lpersistance/Database 类型的静态字段 INSTANCE;在 Lpersistance/Database$Companion 类中;或其超类('persistance.Database$Companion' 的声明出现在 /data/app/split_lib_slice_1_apk.apk 中)在persistance.Database$Companion.init(Database.kt:22)
检查类的反编译版本,我发现INSTANCE
在 Database 类中定义的变量:
.IsInitialised
代码实际上以这种方式在 Java 版本中表示:
很明显,问题是INSTANCE
必须将变量引用为Database.INSTANCE
.
无法理解,为什么代码编译但抛出运行时异常以及如何检查lateinit
变量是否已初始化?
android - Kotlin 如何初始化蓝牙设备
我想在我的项目中使用蓝牙打印机,但我收到了这个错误
这是我的代码
如何在 koltin 中初始化蓝牙设备?,我尝试了一些解决方案,但它不起作用
kotlin - 检查本地 lateinit 变量是否已初始化
可以通过以下方式检查成员 lateinit 变量初始化:
但是,此语法不适用于本地 lateinit 变量。Lint 报告错误:“尚不支持对变量的引用”。逻辑上应该有一种方法可以做到这一点,因为 lateinit 变量在未初始化时内部为空。
有没有办法检查局部变量是否已初始化?
android - 如何从不同的片段更改谷歌地图相机
这是场景:
1)以 开头FragmentA
,其中包含一个谷歌地图片段,相机被移动到用户的 GPS 位置
2)用户切换到FragmentB
,其中有一个 Place Autocomplete Fragment 我抓取用户输入的位置
3)单击 中的按钮后FragmentB
,它会切换回 Fragment A,并且应该将相机位置移动到用户输入的地址FragmentB
问题:
lateinit property mMap has not been initialized
尝试从 更改FragmentA
相机位置时出现错误FragmentB
。但我认为由于 FragmentA 已经加载,mMap 仍然会被初始化。当我在我的片段(按钮导航栏)之间切换时,它会保持片段的状态,所以我知道它没有被破坏。
片段B
片段A
android - 初始化“后期初始化”属性时出现未初始化异常
我不确定我的情况是否无法使用后期初始化属性。但是让我问一下:)
我有一个几乎在每个活动中都使用的 applicationController - 所以我创建了一个BaseActivity
现在的问题是,当我想从子活动中的应用程序控制器获取依赖项时,我得到了一个未初始化的异常。
谢谢你的帮助!