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

Kotlin调用context成员变量提示unresolved reference错误如何解决

报错原因

你在类主构造函数中声明的context: Context只是构造方法的临时入参,Kotlin不会自动将主构造函数的入参声明为类的成员变量。这类临时入参仅能在init初始化块、类成员属性初始化的逻辑中访问,无法在类的成员函数(比如你代码里的onCreateViewHolder)中直接调用,因此触发未解析引用报错。

可行修复方案

你可以根据自己的编码习惯选任意一种方案:

  • 方案1:给构造入参加val/var修饰符,直接声明为类成员
    这是Kotlin中最简洁的写法,添加val(只读)或var(可变)修饰后,构造入参会自动成为类的成员变量,类内所有方法都可以直接访问。修改后的类头代码如下:
    // 给context加上val修饰,如果后续类内要用到list、listener,也需要给这两个参数加val/var
    class NotesListAdapter(val context: Context, val list: List<Notes>, val listener: NotesClickListener) : RecyclerView.Adapter<NotesViewHolder>() {
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NotesViewHolder {
            return NotesViewHolder(LayoutInflater.from(context).inflate(R.layout.notes_list,parent,false))
        }
    }
    
  • 方案2:类内显式声明成员变量,接收构造入参赋值
    如果你需要对传入的参数做额外校验、转换再存为成员变量,可以用这种写法:
    class NotesListAdapter(context: Context, list: List<Notes>, listener: NotesClickListener) : RecyclerView.Adapter<NotesViewHolder>() {
        // 显式定义类成员变量,把构造入参赋值给成员
        private val mContext: Context = context
        private val mList: List<Notes> = list
        private val mListener: NotesClickListener = listener
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NotesViewHolder {
            return NotesViewHolder(LayoutInflater.from(mContext).inflate(R.layout.notes_list,parent,false))
        }
    }
    
  • 方案3:不再通过构造传context,直接从回调参数中获取
    这是RecyclerView适配器的更优实践:onCreateViewHolder传入的parent本身就是条目布局的父容器,自带对应上下文,完全不需要额外在构造函数里传context:
    // 构造函数移除context参数
    class NotesListAdapter(val list: List<Notes>, val listener: NotesClickListener) : RecyclerView.Adapter<NotesViewHolder>() {
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NotesViewHolder {
            // 直接从parent获取context
            return NotesViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.notes_list,parent,false))
        }
    }
    

补充说明:Kotlin和Java的构造函数逻辑有明显区别,Java中构造函数的入参可以直接在类的所有成员方法中访问,但Kotlin必须显式将入参声明为类成员(加val/var,或在类内赋值给成员变量),才能在成员方法中调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 22:31:00