Облачное хранилище: downloadUrl Несоответствие типов: предполагаемый тип - Задача но Ури! ожидалось - PullRequest
0 голосов
/ 30 января 2020

Я только начал изучать android разработку с Kotlin. Я пытаюсь реализовать MVVM в моем проекте.

Сообщение: несоответствие типов. Требуется: Uri! Найдено: Задание

У меня вопрос: как разыграть Задание в URL! ???

У меня есть ViewModel:

class AddVehicleViewModel(private val vehicleRepository: VehicleRepository,
                          onFailureListener: OnFailureListener): BaseViewModel(onFailureListener) {
    private val _mkVehicleCompletedEvent = SingleLiveEvent<Unit>()
    val mkVehicleCompletedEvent = _mkVehicleCompletedEvent
    val user = vehicleRepository.getUser()

    fun mkVehicle(user: User, imageUri: Uri?, auto: String) {
        if (imageUri != null) {
            vehicleRepository.uploadVehicleImage(user.uid, imageUri).onSuccessTask { downloadUrl ->
                Tasks.whenAll(
                    vehicleRepository.createVehicle(user.uid, mkListVehicle(user, auto, downloadUrl.toString()))
                )
            }.addOnCompleteListener {
                _mkVehicleCompletedEvent.call()
            }.addOnFailureListener(onFailureListener)
        }
    }

    private fun mkListVehicle(user: User, auto: String, imageUri: String): DataVehicles {
        return DataVehicles(
            uid = user.uid,
            image = imageUri,
            auto = auto,
            username = user.username,
            city = user.city.toString()
        )
    }
}

и хранилище:

class FirebaseVehicleRepository : VehicleRepository {
    override fun uploadVehicleImage(uid: String, imageUri: Uri): Task<Uri> =
        task { taskSource ->
            storage.child("users").child(uid).child("images")
                .child(imageUri.lastPathSegment.toString()).putFile(imageUri).addOnCompleteListener {
                if (it.isSuccessful) {
                    taskSource.setResult(it.result!!.metadata!!.reference!!.downloadUrl)
                } else {
                    taskSource.setException(it.exception!!)
                }
            }
        }

В этой строке кода мигает ошибка:

taskSource.setResult(it.result!!.metadata!!.reference!!.downloadUrl)

1 Ответ

0 голосов
/ 30 января 2020

Вы не применяете задание к Ури. «Свойство» downloadUrl на самом деле является асинхронным Java методом, называемым getDownloadUrl () , который возвращает задачу. Чтобы получить Uri, нужно использовать присоединение слушателя к Задаче, как вы это делали, когда вызывали putFile(), что также возвращает Задачу.

Используйте шаблон, показанный в документации :

storageRef.child("users/me/profile.png").downloadUrl.addOnSuccessListener {
    // Got the download URL for 'users/me/profile.png'
}.addOnFailureListener {
    // Handle any errors
}

Для вашего случая используйте it.result!!.metadata!!.reference!!.downloadUrl.addOnSuccessListener ...

Также см. Языковой эквивалент java: Как получить URL из хранилища Firebase getDownloadURL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...