首页 > 解决方案 > 完成后如何访问 onDataChange 返回的值?

问题描述

我正在努力访问从数据库返回的信息onDataChange。我知道这是由于它的异步性质,但我需要将这些值存储在某个地方以便在代码完成后访问。

我在 Firebase 数据库中存储了一个user存储latlng定位的子级。然后我的代码按如下方式检索它:

override fun onDataChange(dataSnapshot: DataSnapshot) {
    var user: User?

    dataSnapshot.children.forEach {
        user = it.getValue(User::class.java)
        Log.d("Maps::user::lat", user?.lat.toString()) // Has info
        Log.d("Maps::user::lng", user?.lng.toString()) // Has info
        mMyLocation.latitude = user!!.lat!!
        mMyLocation.longitude = user!!.lng!!
    }
}

val location = LatLng(mMyLocation.latitude, mMyLocation.longitude) // 0.0 and 0.0

该应用程序不仅具有我的位置,而且还具有地图上的其他标记。onMapReady如果我将所有代码移动到方法内部以显示我的位置,则不会显示设置的其他标记。我需要有关如何完成它的建议。

标签: androidfirebase-realtime-databasekotlin

解决方案


首先简单地声明一个 gloabl (witin class) 标记引用

lateint var myLocMarker:Marker

然后在谷歌地图中添加您的位置标记(onmapready 等)

var a = MarkerOptions()
    .position(LatLng(50,6))) // any position, which you already have, i suppose 
myLocMarker = map.addMarker(a)

然后在内部onDataChange将标记位置更新为

override fun onDataChange(dataSnapshot: DataSnapshot) {
    var user: User?

    dataSnapshot.children.forEach {
        user = it.getValue(User::class.java)
        Log.d("Maps::user::lat", user?.lat.toString()) // Has info
        Log.d("Maps::user::lng", user?.lng.toString()) // Has info
        mMyLocation.latitude = user!!.lat!!
        mMyLocation.longitude = user!!.lng!!
        myLocMarker.setPosition(LatLong(user!!.lat!!,user!!.lng!!))
    }
}

推荐阅读