Котлин рекомендовал отменить регистрацию слушателя с помощью SAM

Поэтому у меня есть интерактор, который выполняет операцию вставки с Realm, а затем уведомляет, что вставка завершена с помощью RealChangeListener. Это что-то вроде этого:

fun insertCar(item: Car) { realm.doInTransaction { val car = Car(...) val copy = copyToRealm(car) copy.addChangeListener(...) } } 

Я могу сделать это так:

 fun insertCar(item: Car, listener: RealmChangeListener<Car>) { realm.doInTransaction { val car = Car(...) val copy = copyToRealm(car) copy.addChangeListener(listener) } } 

И получить доступ вот так:

 realmInteractor.insertCar(item, RealmChangeListener { // do something here }) 

Но тогда у меня нет способа удалить этого слушателя

 realmInteractor.insertCar(item, RealmChangeListener { // do something here it.removeChangeListener(this) }) 

this укажет на класс, в котором он находится, а не фактический слушатель

Я также могу это сделать:

 fun insertCar(item: Car, doAfterChange (Car) -> Unit) { realm.doInTransaction { val car = Car(...) val copy = copyToRealm(car) copy.addChangeListener(RealmChangeListener{ doAfterChange() }) } } 

Но тогда у меня есть SAM внутри другого SAM (слишком overkill imo)

Я могу сделать это вот так:

 fun insertCar(item: Car, listener: RealmChangeListener<Car>) { realm.doInTransaction { val car = Car(...) val copy = copyToRealm(car) copy.addChangeListener(listener) } } realmInteractor.insertCar(item, object : RealmChangeListener<Car> { override fun onChange(element: Car?) { ... element?.removeChangeListener(this) } }) 

Это работает, но это слишком много.

Итак, как вы справляетесь с этим и что считается лучшим подходом?

Вы можете создать общий метод для выполнения прослушивателя с однократным запуском. Что-то вроде:

 fun <T> createInRealm(objectFactory: () -> T, changeListener: (T) -> Unit) { realm.doInTransaction { val obj = objectFactory() val copy = copyToRealm(obj) copy.addChangeListener(object : RealmChangeListener<T> { override fun onChange(element: T) { changeListener() element.removeChangeListener(this) } } } } 
Intereting Posts
Как получить данные из базы данных Firebase и сохранить их в ListArray <Class>? – Котлин Android Studio 3.0 + Kotlin Two Gradle Daemon Есть ли способ идентифицировать класс данных Kotlin из обычного класса Kotlin? Как преобразовать java в kotlin в обработчик побитовое и не работает с байтами в котлин Out-projected type «ArrayList <*>» запрещает использование «public open fun add (index: Int, element: E): Unit, определенный в java.util.ArrayList ' Как избежать метода класса фабрики kotlin по подтипу? Использовать значение аргумента по умолчанию в вызове функции Kotlin Повторение действий с состоянием с помощью RxJava Котлинский кастрюля против котлинского бульдога Как я могу получить время, необходимое для проверки производительности функций в Котлине Динамическая оценка шаблонных строк в Котлине Как запросить тип данных Firebase Firestore Reference? Связывающий адаптер с несколькими аргументами в Котлине Идиоматический способ обращения с нулевым или пустым списком в Котлин