9阅网

您现在的位置是:首页 > 知识 > 正文

知识

android - 在Android上使用ViewModel进行状态管理,当在流程中时

admin2022-10-24知识17

基本上我有一个状态管理系统,使用 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 对象,并在多个 Fragments.

您可以检查文件的 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)
        }
    }
}