You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中如何跨函数访问lateinit变量值解决未初始化异常

问题根因

异常是代码执行顺序和lateinit使用不当共同导致的:

  • inOnCreateView属于Fragment视图创建阶段就会触发的生命周期函数,此时你直接调用了viewModel.getSkipFilterList(zipcode, area),但用户还没有点击搜索图标打开弹窗、也没有点击弹窗的搜索按钮,area和zipcode还没有被赋值,自然会抛出未初始化异常。
  • lateinit只适用于变量一定会在首次访问前完成初始化的场景,你的这两个变量属于用户交互后才会生成的值,本身就存在未赋值就被访问的可能,不适合用lateinit定义。
修复步骤
  1. 调整变量定义,替换lateinit为可空类型,设置初始值为null:
var area: String? = null
var zipcode: String? = null
  1. 移除inOnCreateView中不必要的接口调用:你已经在搜索按钮的点击事件中调用过viewModel.getSkipFilterList(zipcode, area),这个接口本身就是用户提交搜索后才需要触发的,初始化阶段不需要调用,直接删掉inOnCreateView中的对应代码即可。
    如果业务确实需要页面初始化时就调用该接口,可以给参数设置默认值:
// 示例:初始化时传空字符串作为默认参数
viewModel.getSkipFilterList(zipcode ?: "", area ?: "")
可选补充

如果你坚持要保留lateinit的写法,每次访问前可以先判断变量是否已经完成初始化,避免异常:

if (::area.isInitialized && ::zipcode.isInitialized) {
    viewModel.getSkipFilterList(zipcode, area)
}

另外注意你当前搜索按钮的逻辑中,如果sliderArea为null,area不会被赋值,即使用户点击了搜索也可能触发未初始化异常,建议补充该分支的赋值逻辑。

内容的提问来源于stack exchange,提问作者faiz dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:30:04