По какой-то причине Kotlin недостаточно умен в обеспечении observe
перегрузок:
// Java declaration
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer)
Теперь в Котлине мы можем вызывать этот метод двумя способами:
// Default Kotlin conversion [ #1 ]
fun observe(owner : LifecycleOwner, observer : Observer<in T>)
// SAM conversions [ #2 ]
fun observe(owner: () -> Lifecycle, observer : (T) -> Unit)
Чего нам не хватает, так это чего-то промежуточного, где мы предоставляем функцию только для аргумента наблюдателя.
Если у вас уже есть зависимость от модулей Android KTX, то расширение androidx.fragment:fragment-ktx
(или хотя бы androidx.lifecycle:lifecycle-livedata-core-ktx
) ниже уже должно быть доступно. В противном случае вы можете быстро добавить его:
// custom extension with function observer argument [ #3 ]
@MainThread inline fun <T> LiveData<T>.observe(
owner: LifecycleOwner,
crossinline onChanged: (T) -> Unit
): Observer<T> {
val wrappedObserver = Observer<T> { t -> onChanged.invoke(t) }
observe(owner, wrappedObserver)
return wrappedObserver
}
Теперь вот разница в вызове:
// reusable observer object
val myObserver = Observer<TimeMeasurement> { updateTime(it) }
// function that updates time
fun updateTime(time : TimeMeasurement){
// update views with time
}
override fun onCreate(savedInstanceState: Bundle?) {
/* ... */
// default call [ #1 ]
mViewModel.liveData.observe(this, myObserver)
// default call but with object expression for observer [ #1 ]
mViewModel.liveData.observe(this, Observer { updateTime(it) })
// alternatively [ #1 ]
mViewModel.liveData.observe(this, Observer(::updateTime))
// SAM conversions, lets us pass function reference or a lambda [ #2 ]
// in this case first argument is a lambda as well and it returns lifecycle
mViewModel.liveData.observe({ lifecycle }, ::updateTime)
// extension function call where we pass function reference as second argument [ #3 ]
mViewModel.liveData.observe(this, ::updateTime)
// or using lambda [ #3 ]
mViewModel.liveData.observe(this) { updateTime(it) }
}
person
Pawel
schedule
28.08.2019
val
androidx.lifecycle.Observer, а не функция. - person IgorGanapolsky   schedule 28.08.2019