【问题标题】:Observer pattern is not working in Android MVVM观察者模式在 Android MVVM 中不起作用
【发布时间】:2021-03-29 14:24:17
【问题描述】:

我正在尝试根据我的 ViewModel 中的数据使用 MVVM 更新我的视图 我需要在 onCacheReception 方法中每当区域发生变化时更新我的​​地图

视图模型

class MainViewModel constructor(application: Application) : AndroidViewModel(application),
    CacheListener {

    private val instance = Initializer.getInstance(application.applicationContext)
    private val _zones = MutableLiveData<List<Zone>>()
    val zones: LiveData<List<Zone>>
        get() = _zones

    init {
        CacheDispatcher.addCacheListener(this)
    }

    override fun onCacheReception() {
        val zonesFromDB: List<Zone>? = instance.fetchZonesInDatabase()

        _zones.value = zonesFromDB
    }
}

主活动

class MainActivity : AppCompatActivity(), EasyPermissions.PermissionCallbacks, OnMapReadyCallback {
    private val mainViewModel: MainViewModel = ViewModelProvider(this).get(MainViewModel(application)::class.java)
    private lateinit var initializer: Initializer

    private lateinit var map: GoogleMap

    private val REQUEST_CODE_LOCATIONS: Int = 100
    private val permissionLocationsRationale: String = "Permissions for Fine & Coarse Locations"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (checkForLocationsPermission()) {
            setUp()
            mapSetUp()
        }

        mainViewModel.zones.observe(this, Observer { zones ->
            zones.forEach {
                Log.i("YES DATA", "Data has been updated")
                val latLng = it.lat?.let { it1 -> it.lng?.let { it2 -> LatLng(it1, it2) } }
                val markerOptions = latLng?.let { it1 -> MarkerOptions().position(it1) }
                map.addMarker(markerOptions)
            }
        })
    }

我的日志从不显示,并且在调试时似乎没有在我的 ViewModel 中收到一些新数据时调用 mainView.zones.observe { }

【问题讨论】:

    标签: kotlin mvvm androidx


    【解决方案1】:

    onCacheReception() 中,替换:

    _zones.value = zonesFromDB
    

    作者:

    _zones.postValue(zonesFromDB)
    

    如果您的 onCacheReception() 函数是从工作线程调用的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 2011-01-22
      • 2016-02-20
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多