【Android】在Kotlin中更優雅地使用LiveData

fundroid_方卓發表於2020-10-01
【Android】在Kotlin中更優雅地使用LiveData

由於LiveData#Observer介面定義在Java中,且接受一個Nullable引數,導致其不能很好的相容Kotlin的SAM以及NonNull等語法特性:

  viewModel.order.observe(viewLifecycleOwner, Observe {  
      it?.let { applyCurrentOrder(it) }
  })
  • Observe { .. }不能省略
  • ?.let顯得非常多餘

現在使用lifecycle-livedata-ktx可以幫我們在Kotlin中更好的使用LiveData:

dependencies {
        def lifecycle_version = "2.1.0" // or higher
        ...
        implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
        ...
    }

然後我們可以在程式碼中更加優化的observe了:

class MyViewModel: ViewModel() {
  private val _data: MutableLiveData<MyData> = MutableLiveData()
  val order: LiveData<MyData> get() = _data
  ..
  fun updateData(data: MyData) {
    _data.value = data
  }
}
import androidx.lifecycle.observe  //ktx的observe

class MyFragment: Fragment(R.layout.my_fragment) {
  private val viewModel: MyViewModel by viewModels()

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    viewModel.order.observe(viewLifecycleOwner) {
        // observe接受lambda,且it為NonNull
        applyData(it)
    }
  }

  fun applyData(order: Order) {
    ..
  }
}

期待未來所有的AAC庫都會用Kotlin重寫,那時就不需要這些Ktx庫做橋接了。

相關文章