提问者:小点点

Android ViewModel LiveData文档


我读了文档,但在某些部分变得迷惑了。

ViewModel对象被设计为比views或LifeCycleOwners的特定实例化更长寿。这种设计还意味着您可以编写测试以更容易地覆盖ViewModel,因为它不知道视图和生命周期对象。ViewModel对象可以包含LifecycleObservers,如LiveData对象。但是,ViewModel对象绝不能观察到生命周期感知的可观察对象(如LiveData对象)的更改。如果ViewModel需要应用程序上下文,例如查找一个系统服务,它可以扩展AndroidViewModel类,并拥有一个构造函数来接收构造函数中的应用程序,因为Application类扩展了上下文。

这部分对我来说有点迷惑

但是,ViewModel对象绝不能观察到生命周期感知的可观察对象(如LiveData对象)的更改。

这是指这种执行吗?

片断

class AboutFragment : Fragment() {

    private lateinit var aboutViewModel: AboutViewModel
    private var _binding: FragmentAboutBinding? = null

    // This property is only valid between onCreateView and
    // onDestroyView.
    private val binding get() = _binding!!

    override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View {
        aboutViewModel =
                ViewModelProvider(this).get(AboutViewModel::class.java)

        _binding = FragmentAboutBinding.inflate(inflater, container, false)
        val root: View = binding.root

        val textView = binding.aboutTxt

        //Observe changes
        aboutViewModel.text.observe(viewLifecycleOwner, {
            textView.text = it
        })
        return root
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

视图模型

class AboutViewModel : ViewModel() {

private val _text = MutableLiveData<String>().apply {
    value = "Foobar......"
           
}

fun setText(text: String){ _text.value = text}

val text: LiveData<String> = _text

}

或者这就是他们的意思livedata>不要做的?


共1个答案

匿名用户

这意味着您永远不应该在viewmodel中的livedata对象上使用observe,而应该在activity/片段中使用observe,就像您已经在做的那样