基本上我有一个状态管理系统,使用 ViewModel
看起来是这样的。
class ViewModelA: ViewModel() {
private val repository: RepositoryA by inject()
private val _stateLiveData = MutableLiveData<ViewState>()
val stateLiveData: LiveData<ViewState> get() = _stateLiveData
private val _eventLiveData = SingleLiveEvent<ViewEvent>()
val eventLiveData: LiveData<ViewEvent> get() = _eventLiveData
private val exceptionHandler = CoroutineExceptionHandler { _, _ ->
_stateLiveData.postValue(ViewState.Error)
}
fun loadList() {
if (_stateLiveData.value is ViewState.Loading) return
launch(exceptionHandler) {
_stateLiveData.run {
value = ViewState.Loading
value = repository.getDocumentList().let {
if (it.isEmpty()) ViewState.Error
else ViewState.Data(it)
}
}
}
}
}
但每当我分享一个 ViewModel
有几个 Fragments
,它变得越来越大。我正在寻找一个解决方案,因为我不想把整个应用流程的所有逻辑都集中在一个叫作 "T "的应用程序中。ViewModel
而且我也不希望一直在这里和那里传递参数。
PS:对不起,我的英语不好.编辑:澄清一下问题。
我不太明白你的问题。但是,如果你的问题是这样的。
我怎么能共享同样的...
ViewModel
对象,并在多个Fragment
s.
您可以检查文件的 ViewModelProvider 它是一个实用类,提供 ViewModel
的特定范围,如 Activity
.
以下是一个使用 ViewModelProvider
两内 Fragment
将会被创建和使用在相同的产品中。Activity
对象。
// An example ViewModel
class SharedViewModel : ViewModel() {
val intLiveData = MutableLiveData<Int>() // an example LiveData field
}
// the first fragment
class Fragment1 : Fragment() {
private lateinit var viewModel: SharedViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = requireActivity().let { activity ->
ViewModelProvider(activity).get(SharedViewModel::class.java)
}
}
}
// the other fragment
class Fragment2 : Fragment() {
private lateinit var viewModel: SharedViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = requireActivity().let { activity ->
ViewModelProvider(activity).get(SharedViewModel::class.java)
}
}
}