RxJava: как вернуть правильный тип null

Я разрабатываю приложение с использованием Firebase, Kotlin и RxJava.

В основном, мне нужно сделать регистрацию пользователя, использующего Auth из Firebase, если пользователь выбрал фотографию, загрузите фотографию и затем сохраните пользователя в базе данных Firebase.

До сих пор у меня это

RxFirebaseAuth.createUserWithEmailAndPassword(auth, email, password) .map { authResult -> user.uid = authResult.user.uid authResult.user.uid } .flatMap<UploadTask.TaskSnapshot>( { uid -> if (imageUri != null) RxFirebaseStorage.putFile(mFirebaseStorage .getReference(STORAGE_IMAGE_REFERENCE) .child(uid), imageUri) else Maybe.empty<UploadTask.TaskSnapshot>() } ) .map { taskSnapshot -> user.photoUrl = taskSnapshot.downloadUrl!!.toString() } .map { RxFirebaseDatabase .setValue(mFirebaseDatabase.getReference("user") .child(user.uid), user).subscribe() } .doOnComplete { appLocalDataStore.saveUser(user) } .toObservable() 

Он работает правильно, когда пользователь выбирает фотографию, но когда она не выбрана, другие карты игнорируются, потому что я вернул Maybe.empty ().

Как мне реализовать это для работы с фото пользователя или без него?

Благодарю.

Взгляните на следующую конструкцию:

  val temp = null Observable.just("some value") .flatMap { // Throw exception if temp is null if (temp != null) Observable.just(it) else Observable.error(Exception("")) } .onErrorReturnItem("") // return blank string if exception is thrown .flatMap { v -> Single.create<String>{ // do something it.onSuccess("Yepeee $v"); }.toObservable() } .subscribe({ System.out.println("Yes it worked: $it"); },{ System.out.println("Sorry: $it"); }) 

Вы должны выбросить ошибку, если встретите нуль, а затем используйте onErrorReturn{} или onErrorReturnItem() чтобы вернуть значение по умолчанию, которое будет передано следующей цепочке операторов, без onError на onError в Observer .

Таким образом, ваш код должен выглядеть так:

 RxFirebaseAuth.createUserWithEmailAndPassword(auth, email, password) .map { authResult -> user.uid = authResult.user.uid authResult.user.uid } .flatMap<UploadTask.TaskSnapshot>( { uid -> if (imageUri != null) RxFirebaseStorage.putFile(mFirebaseStorage .getReference(STORAGE_IMAGE_REFERENCE) .child(uid), imageUri) else Observable.error<Exception>(Exception("null value")) // Throw exception if imageUri is null } ) .map { taskSnapshot -> user.photoUrl = taskSnapshot.downloadUrl!!.toString() } .onErrorReturn { user.photoUrl = "" // assign blank url string if exception is thrown } .map { RxFirebaseDatabase .setValue(mFirebaseDatabase.getReference("user") .child(user.uid), user).subscribe() } .doOnComplete { appLocalDataStore.saveUser(user) } .toObservable() 

Но есть проблема с этим кодом, что любое исключение произошло до того, как onErrorReturn даст пустой uri и приведет к дальнейшему выполнению последовательности, чего мы не хотим. Если возникает какое-либо другое исключение, необходимо вызвать вызовError.

Для этого нам нужно создать собственный класс исключений и поймать это исключенное исключение в onErrorReturn . Посмотрите следующий фрагмент:

 ... ... .flatMap<UploadTask.TaskSnapshot>( { uid -> if (imageUri != null) RxFirebaseStorage.putFile(mFirebaseStorage .getReference(STORAGE_IMAGE_REFERENCE) .child(uid), imageUri) else Observable.error<MyCustomException>(MyCustomException("null value")) // Throw exception if imageUri is null } ) .map { taskSnapshot -> user.photoUrl = taskSnapshot.downloadUrl!!.toString() } .onErrorReturn { if(it !is MyCustomException) throw it else user.photoUrl = "" // assign blank url string if exception is thrown } ... ... 

Надеюсь, поможет.

Intereting Posts
Разумные ситуации для использования `Let` Котлина Kotlin + Spring AliasFor Словарь обфускации Proguard для kotlin Kotlin: Как я могу вызвать лямбда-поле, которое имеет общий тип его класса? Android RecyclerView Обработка данных с использованием Kotlin: индекс переключения строк после модификации Котлин, проблема создания экземпляров и общий Почему Kotlin позволяет иметь два класса с одинаковым именем и пакетом в разных папках (например, main и androidTest)? Kotlin не может идентифицировать параметры, если явно не указано Ошибка в печатном простом номере с использованием функций высокого порядка в котлине Требуется <Объект> и найден <Объект>? Как использовать KeyEvent в Котлине Почему первое вычисление в приложении для Android медленное, а все последующие вычисления быстры Одновременно создаются два объекта SQLiteDao, один из которых не создает таблицу при выполнении Helper Я хочу добавить мою версию kotlin в проект gradel Карта Котлина с ненулевыми значениями