当前位置: 首页 > 知识库问答 >
问题:

无法从活动中观察viewmodel中的livedata集

壤驷敏学
2023-03-14

我是一个新的Android开发人员,我正试图观察ViewModel中的布尔集。当应用程序启动时,我可以观察到它的初始状态,但以后应用的任何更改似乎都不会触发观察者(即当我切换片段时)。

下面是我的ViewModel的代码:

class MyMusicViewModel  : ViewModel() {


    private var _MyMusicViewOn = MutableLiveData<Boolean>()
    val MyMusicViewOn: LiveData<Boolean> get() = _MyMusicViewOn



    init {
        Timber.i("MyMusicViewModel Init Called!")
        setMyMusicView(true)
    }

    override fun onCleared() {
        super.onCleared()
        Timber.i("MyMusicViewModel Cleared!")
        setMyMusicView(false)
    }


    fun setMyMusicView(setter: Boolean) {
        Timber.i("MyMusicViewModel setter called! %s", setter)
        _MyMusicViewOn.value = setter
    }


}
class FullscreenActivity : AppCompatActivity() {


    private val viewModel: MyMusicViewModel by viewModels()

  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

       
        viewModel.MyMusicViewOn.observe(this, Observer { MyMusicViewOn ->
            Timber.i("Observer called for MyMusicViewOn %s", MyMusicViewOn)
        })

    }

}
class MyMusicFragment : Fragment() {

    private lateinit var viewModel: MyMusicViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val binding = DataBindingUtil.inflate<FragmentMyMusicBinding>(
            inflater,
            R.layout.fragment_my_music,
            container,
            false
        )
        
        viewModel = ViewModelProvider(this).get(MyMusicViewModel::class.java)

        return binding.root
    }
    

    override fun onResume() {
        super.onResume()

        Timber.i("MyMusicViewFragment resumed!")
        viewModel.setMyMusicView(true)

    }




}

万事如意,

晶圆厂。

共有1个答案

魏彦
2023-03-14

我猜想,无论您在片段中填充ViewModel属性,您都没有使用活动的ViewModel实例。获取活动正在使用的相同实例的最简单方法是使用ActivityViewModels委托:

private val viewModel: MyMusicViewModel by activityViewModels()
 类似资料:
  • 我有一个单独的类来处理数据提取(特别是Firebase),我通常从它返回LiveData对象并异步更新它们。现在我希望将返回的数据存储在ViewModel中,但问题是为了获得所述值,我需要观察从数据提取类返回的LiveData对象。observe方法需要一个LifecycleOwner对象作为第一个参数,但我的ViewModel中显然没有这个对象,而且我知道我不应该在ViewModel中保留对ac

  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?

  • 我正在寻找在中观察数据的最佳方法。 我正在使用MVVM数据绑定。 存储库: 它从服务器请求数据并返回实时数据。ViewModel必须观察数据更改。 视图模型: ViewModel使用一个来观察来自存储库的的变化。我添加了数据作为源来观察变化,并在它触发后将其删除,以防止在我多次获取数据时多次触发事件。并且必须有一个虚假的观察者来观察,因此触发器的onChange方法。 比方说,我只需要数据来隐藏/

  • 对于LiveData和MVVM架构,我完全是个新手。我想知道如何观察一个实时数据 我通过以下方式从我的房间数据库中获取实时数据: 我希望ViewModel中的另一个变量,,在列表返回空(null)时进行更新。这将用于从Visible更新片段中的ImageView。去看电视了。看得见的 我如何检查如果是空的同步? 我四处阅读,看到一些人说使用,但是架构指南明确建议不要使用ViewModel中的任何观

  • 因此,我遇到的问题是,我希望在中有一个的实例,以便在活动和片段中观察它。我怎样才能做到这一点?

  • 我在我的Android应用程序中遵循MVVM架构。(https://developer.android.com/jetpack/guide)。我所有的存储库函数都返回一个网络边界资源对象。你可以从jetpack指南链接中阅读更多关于这个设计实现的信息,或者从谷歌这里查看示例项目 在这个特殊的问题中,当我在屏幕上下拉时,我试图通过网络重新获取信息。 目前的工作执行情况 片段侦听器(当屏幕下拉时触发)