Несоответствие типов в адресе геокодера - PullRequest
1 голос
/ 26 мая 2019

Я реализую код в kotlin, чтобы показать адрес в карте Google.У меня есть адрес, хранящийся в Firebase.Я извлекаю данные и преобразовываю адрес в строку, а затем пытаюсь найти широту и долготу из них.Вот мой код для получения широты и долготы:

   private fun getLocationFromAddress(context: Context, addkey: String?): LatLng? {

    val coder = Geocoder(context)
    val address: List<Address>
    var p1: LatLng? = null
    var strAddress = ""

    try {

        val user = FirebaseAuth.getInstance().currentUser
        val userid = user?.uid
        mRef = FirebaseDatabase.getInstance().reference.child("users").child(userid.toString()).child("users")

        mRef.child(addkey.toString()).addValueEventListener(object: ValueEventListener{
            override fun onCancelled(p0: DatabaseError) {
            }

            override fun onDataChange(p0: DataSnapshot) {
                strAddress = p0.child("****").child(addkey.toString()).child("***").getValue(String::class.java)

            }

        })
        address = coder.getFromLocationName(strAddress, 5)
        if (address == null) {
            return null
        }

        val location = address[0]
        p1 = LatLng(location.latitude, location.longitude)

    } catch (ex: IOException) {

        ex.printStackTrace()
    }


    return p1

}

Однако я получаю ошибку несоответствия типов по адресу address = coder.getFromLocationName (strAddress, 5).

Там написано: "Несоответствие типов. Обязательно: список" Мой проект Name.com ". Найден адрес: (изменяемый) Список android.location.Address!>!

Ответы [ 2 ]

1 голос
/ 26 мая 2019

Причиной этой ошибки может быть неправильный импорт. В сообщении об ошибке говорится, что он ожидает список xxx.com.Address объектов (посмотрите, где вы определили val address: List<Address>), в то время как он обнаружил список android.location.Address (это тип, возвращаемый API геокодера).

Изменив неправильный оператор import в верхней части файла, вы должны решить эту проблему. Или, что еще лучше, вы можете изменить свой код так, чтобы вы определяли переменную только там, где это необходимо, и позволяли выводу типа Kotlin делать свое «волшебство»:

val address = coder.getFromLocationName(strAddress, 5)

EDIT

В этом конкретном случае, возможно, вы все же захотите явно определить тип, потому что ваш код Kotlin вызывает API, написанный на Java, который не использует @Nullable / @NotNull (или аналогичные аннотации), поэтому Компилятор не может правильно определить недействительность, а тип результата - «тип платформы» (т. е. SomeType!). Поэтому, если вы знаете, что что-то не должно быть нулевым, вы можете заставить его быть ненулевым, явно введя свою переменную (или наоборот):

val address: List<Address> = coder.getFromLocationName(strAddress, 5)

Подробнее: Типы нулевой безопасности и платформы .

0 голосов
/ 26 мая 2019

изменить объявление address

val address: MutableList<Address>

List нельзя изменить, но вы получите изменяемый список обратно.

...