问题描述
嗨,我的第一篇文章在这里。我是Kotlin的新手,所以这可能是一个愚蠢的问题,请耐心等待。
我对Kotlin中使用的lambda语法有点困惑。
例如,在setonClickListener()中,我们直接传递一个lambda块:
button.setonClickListener {
viewmodel.insert(MyData("Title","Desc",android.R.drawable.arrow_up_float))
}
但是在.observe()方法中,我们不传递lambda块,而是传递Observer对象(带有lambda?):
viewmodel.getAllData().observe(this,Observer<List<MyData>> { t -> myAdapter.submitList(t)
})
我首先尝试了这种匿名类方法,但是IDE建议我将其转换为lamda(上方)。
viewmodel.getAllData().observe(this,object: Observer<List<MyData>>{
override fun onChanged(t: List<MyData>?) {
myAdapter.submitList(t)
}
})
那么这两种使用.observe()方法的方式有什么区别?在两种情况下,我们仍在传递匿名类Observer的对象,对吗?
此外,当以相同的方式定义这些接口时,为什么onClickListener()和.observe()方法的lambda语法会有所不同?:
OnClickListener界面:
public interface OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
void onClick(View v);
}
观察者界面:
public interface Observer<T> {
/**
* Called when the data is changed.
* @param t The new data
*/
void onChanged(T t);
}
感谢您的帮助:)
解决方法
您正在使用的是package androidx.lifecycle;
类的LiveData.java
。
文件package androidx.lifecycle
中LiveData.kt
上还有一个扩展名,它将产生Sugar语法,从而导致
observable.observe(viewLifeCyleOwner) {
//...
}
要使用它,您必须导入
import androidx.lifecycle.observe
区别是1个参数lambda如果不使用,则可以忽略该参数,在观察者的情况下,有2个参数,因此这就是方便的花花公子扩展名的原因。
您可以在以下link
中了解有关lambda的更多信息