【发布时间】:2021-07-27 15:41:06
【问题描述】:
我正在为练习 MVVM 架构和 SQLite 数据库开发一个议程应用程序,但我需要从片段内部更改片段。所以对于 calendarFragment,我创建了这个 viewModel,但我不能在没有 MainActivity 上下文的情况下使用 .supportFragmentManager 方法。我该如何解决这个问题?
class calendarFragmentViewModel(application: Application) : AndroidViewModel(application) {
fun fragmentChanger(fragment : Fragment, context: Context?) {
var transaction = (context as MainActivity).supportFragmentManager.beginTransaction()
transaction.replace(com.cagataysencan.agendea.R.id.frameLayout,fragment)
transaction.commit()
}
}
【问题讨论】:
-
你不应该在 ViewModel 中这样做,应该在 Fragment OR Activity 中这样做。
-
使用活动?.supportFragmentManager
-
扩展@QAMAR 评论。按照惯例,
ViewModel应该对按钮点击之类的事情做出反应,即onNewSearch(text : String)- 只有当ViewModel有理由更改状态/数据时。相反,View只需要观察状态和数据的变化,无论是实时数据、实时数据 + 数据绑定、状态流、状态流 + 数据绑定、可组合等 .. 您的fragmentChanger并不代表状态或数据更改为ViewModel因此不属于那里。但是,由于您的方法,系统将调用ViewModel::onCleared作为副作用,这是状态更改。