LiveData观察者的Kotlin语法?

Ted*_*nry 21 android kotlin

我在我的代码中HomeActivity使用了以下一些代码LiveData.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    // Show the launch splash screen.
    //
    this.setContentView(R.layout.activity_home)

    this.viewModel = ViewModelProviders.of(this).get(HomeViewModel::class.java)

    this.viewModel.getUser().observe(this, Observer { user: User? ->

    });

}
Run Code Online (Sandbox Code Playgroud)

虽然这似乎有效,但以下部分是什么意思?

Observer { user: User? ->

}
Run Code Online (Sandbox Code Playgroud)

这必须导致一个符合Observer接口的对象

void onChanged (T t)
Run Code Online (Sandbox Code Playgroud)

https://developer.android.com/reference/android/arch/lifecycle/Observer.html

如何

Observer { user: User? ->

}
Run Code Online (Sandbox Code Playgroud)

导致一个onChanged方法的对象?

我不知道将接口名称放在lambda表达式前面是什么意思.

谢谢!

s1m*_*nw1 17

这称为SAM转换,这个概念有助于与您的示例中的Java 单一抽象方法接口进行交互.

以下创建了一个实现Runnable,其中单个抽象方法是run():

val runnable = Runnable { println("This runs in a runnable") }
Run Code Online (Sandbox Code Playgroud)

它在文档中描述:https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions

或者,但更冗长,将使用object:

val runnable2 = object : Runnable {
        override fun run() {
            println("This runs in a runnable")
        }
}
Run Code Online (Sandbox Code Playgroud)

两者都是匿名实现的例子interface.当然也可以创建一个具体的子类并然后实例化它.

class MyRunnable : Runnable {
    override fun run() {
        println("This runs in a runnable")
    }
}

val runnable3 = MyRunnable()
Run Code Online (Sandbox Code Playgroud)

  • 它似乎可以写成`this.viewModel.getUser().observe(this,object:Observer <User> {override fun onChanged(user:User?){}});` (7认同)

Ami*_*aza 9

在 Kotlin 中,Observer { }lambda 为您提供 param it,您可以根据需要重命名并使用。默认情况下,数据将可用it.something()等...

爪哇:

... new Observer {
  void onChanged(User user){
     user.something()
  }
}
Run Code Online (Sandbox Code Playgroud)

科特林

... object : Observer<User> {
   fun onChanged(user: User){
        user.something()
   }
}
Run Code Online (Sandbox Code Playgroud)

或者

... Observer {
   it.something()
}
Run Code Online (Sandbox Code Playgroud)

您可以将其重命名为您想要的任何名称

... Observer { myUser ->
   myUser.something()
}
Run Code Online (Sandbox Code Playgroud)