我正在用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
}
但是,我在地址= coder.getFromLocationName(strAddress,5)处收到类型不匹配错误。
它说:“类型不匹配。 必需:列出“我的项目Name.com”。地址 找到:(可变)列出android.location.Address!>!
答案 0 :(得分:1)
该错误的原因很可能是错误的导入。该错误消息表示,它期望找到xxx.com.Address
对象(这是Geocoder API返回的类型)的列表,val address: List<Address>
对象的列表(看看您定义android.location.Address
的位置)。
通过更改文件顶部的错误import
语句,您应该可以解决此问题。或者,甚至更好的是,您可以更改代码,以便仅在需要的地方定义变量,然后让Kotlin的类型推断实现其“魔力”:
val address = coder.getFromLocationName(strAddress, 5)
在这种特定情况下,您可能仍想明确定义类型,因为您的Kotlin代码正在调用用Java编写的,不使用@Nullable
/ @NotNull
(或类似注释)的API ),因此编译器无法正确推断出null,并且结果类型为“平台类型”(即SomeType!
)。因此,如果您知道某些内容不应该为null,则可以通过显式键入变量(反之亦然)来强制其为非null:
val address: List<Address> = coder.getFromLocationName(strAddress, 5)
答案 1 :(得分:0)
更改address
的声明
val address: MutableList<Address>
List
是不可变的,但是您会得到一个可变的列表。