在流中使用 Android 上的 ViewModel 进行状态管理



基本上我有一个使用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(提供ViewModels。

以下是将在同一Activity对象中创建和使用的两FragmentViewModelProvider用法的示例代码:

// 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)
}
}
}

相关内容

  • 没有找到相关文章

最新更新