如何从 uiState.Succes 状态获取数据?

问题描述 投票:0回答:0

我有一个 ViewModel,我在其中接收数据。此外,在该片段中,我从 ViewModel 接收数据,并根据状态执行各种操作(显示数据或显示错误消息)。问题:如何在成功情况下访问片段中的数据,以及在失败时显示错误文本?

抱歉,如果问题表述不当,我只是在学习。

在 ViewModel 中加载函数

 fun loadData() {
        viewModelScope.launch(Dispatchers.IO) {
          try {
              supervisorScope {
                  val authorListLoad = async {
                      getDataUseCase.getAuthors()
                  }
                  val bookListLoad = async {
                      getDataUseCase.getBooks()
                  }
                  val availabilityListLoad = async {
                      getDataUseCase.getAvailability()
                  }

                  val authorsList = authorListLoad.await().sortedBy { it.name }
                  val booksList = bookListLoad.await().sortedBy { it.title }
                  val availabilityList = availabilityListLoad.await()

                  _uiState.update {
                      BookListUiState.Success(createAuthorModel(authorsList,booksList,availabilityList))
                  }

                  Log.d("DataLoading", "Data successfully loaded")
              }
          }
          catch (e : Exception) {
              _uiState.update {
                  BookListUiState.Error("Ошибка")
              }
              Log.d("DataLoading", "Data loading error")
          }

Fragment 中的 onViewCreated 函数

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        adapter = AuthorAdapter()
        binding.recyclerViewAuthor.adapter = adapter

        viewLifecycleOwner.lifecycleScope.launch {
            repeatOnLifecycle(Lifecycle.State.STARTED) {

                viewModel.uiState.collect { uiState ->
                    when (uiState) {
                        is BookListUiState.Loading ->{
                            binding.textViewInfo.text = getString(R.string.text_view_info_message_loading)
                            binding.textViewInfo.visibility = View.VISIBLE
                        }
                            is BookListUiState.Success -> {
                                    **How can i get data?**
                                    binding.textViewInfo.visibility = View.GONE
                                    binding.recyclerViewAuthor.visibility = View.VISIBLE
                            }
                                is BookListUiState.Error->{
                                    **How Can i get error message?**
                                    binding.textViewInfo.text = getString(R.string.text_view_info_message_data_loading_error)
                                    binding.textViewInfo.visibility = View.VISIBLE
                                }
                        else -> {
                            binding.textViewInfo.text = getString(R.string.text_view_info_message_unknown_error)
                            binding.textViewInfo.visibility = view.visibility
                        }
                    }
                            }
                        }

                    }
                    }

        }
android kotlin android-fragments android-viewmodel
© www.soinside.com 2019 - 2024. All rights reserved.