Android / Kotlin:为什么.setOnClickListener和.observe的lambda语法不同?

问题描述

嗨,我的第一篇文章在这里。我是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.lifecycleLiveData.kt上还有一个扩展名,它将产生Sugar语法,从而导致

observable.observe(viewLifeCyleOwner) {
    //...
}

要使用它,您必须导入

import androidx.lifecycle.observe

区别是1个参数lambda如果不使用,则可以忽略该参数,在观察者的情况下,有2个参数,因此这就是方便的花花公子扩展名的原因。

您可以在以下link

中了解有关lambda的更多信息