基本上我有一个使用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)
}
}
}
}
}
但是每当我和几个Fragments
分享一个ViewModel
时,它就会变得越来越大。我正在寻找解决方案,因为我不想将整个应用程序流的所有逻辑集中在ViewModel
内,也不想一直在这里和那里传递参数。
PS:对不起,我的英语不好。 编辑:澄清一点问题。
我不太明白你的问题。但是,如果您的问题如下:
如何共享同一个
ViewModel
对象并在多个Fragment
中使用它。
您可以查看 ViewModelProvider 的文档,这是一个实用程序类,可为特定范围(如Activity
(提供ViewModel
s。
以下是将在同一Activity
对象中创建和使用的两Fragment
内ViewModelProvider
用法的示例代码:
// 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)
}
}
}