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
相关产品推荐
相关产品推荐

