android 为什么加载后结果不显示在屏幕上?

prdp8dxp  于 2023-06-27  发布在  Android
关注(0)|答案(1)|浏览(148)

当应用程序启动时,在我的情况下,屏幕上什么也没有发生(一个没有数据的空白屏幕),但只对logcat中的用户,它显示数据正在从服务器加载。只要我切换到另一个屏幕,数据就会出现一瞬间,然后消失,当我返回到“ForYouScreen”屏幕时,数据就会出现。它应该是:CircularProgressIndicator函数应首先工作,然后显示数据。我提供了下面的代码:

  1. class NewsRepositoryImpl : NewsRepository {
  2. override fun getNewsArticles(): Flow<Resource<List<NewsArticle?>>> {
  3. val newsList: MutableList<NewsArticle?> = mutableListOf()
  4. var temp: List<NewsArticle?>
  5. val db: FirebaseFirestore = FirebaseFirestore.getInstance()
  6. return flow{
  7. emit(Resource.Loading())
  8. db.collection("newsArticles").get()
  9. .addOnSuccessListener { queryDocumentSnapshots ->
  10. if (!queryDocumentSnapshots.isEmpty) {
  11. val list = queryDocumentSnapshots.documents
  12. for (d in list) {
  13. val c: NewsArticle? = d.toObject(NewsArticle::class.java)
  14. newsList.add(c)
  15. }
  16. }
  17. }
  18. temp = newsList
  19. emit(Resource.Success(temp))
  20. }.catch {
  21. emit(Resource.Error(it.message.toString()))
  22. }
  23. }
  24. }
  1. class GetNewsArticlesUseCase(
  2. private val repository: NewsRepository
  3. ) {
  4. operator fun invoke(): Flow<Resource<List<NewsArticle?>>> {
  5. return repository.getNewsArticles()
  6. }
  7. }
  1. class ForYouScreenViewModel(
  2. private val getNewsArticlesUseCase: GetNewsArticlesUseCase
  3. ) : ViewModel() {
  4. private val _state = mutableStateOf(ForYouState())
  5. val state: State<ForYouState> = _state
  6. init {
  7. loadNewsArticles()
  8. }
  9. private fun loadNewsArticles() {
  10. getNewsArticlesUseCase().onEach { result ->
  11. when(result){
  12. is Resource.Success -> {
  13. _state.value = ForYouState(newsArticles = result.data ?: emptyList())
  14. }
  15. is Resource.Loading -> {
  16. _state.value = ForYouState(isLoading = true)
  17. }
  18. is Resource.Error -> {
  19. _state.value = ForYouState(error = result.message ?: "An unexpected error occurred")
  20. }
  21. }
  22. }.launchIn(viewModelScope)
  23. }
  24. }
  25. data class ForYouState(
  26. val isLoading: Boolean = false,
  27. val newsArticles: List<NewsArticle?> = emptyList(),
  28. val error: String = ""
  29. )
  1. @Composable
  2. fun ForYouScreen(
  3. externalRouter: Router,
  4. lifecycleOwner: LifecycleOwner,
  5. viewModel: ForYouScreenViewModel = koinViewModel()
  6. ) {
  7. val state = viewModel.state.value
  8. Box(modifier = Modifier.fillMaxSize()) {
  9. LazyColumn(modifier = Modifier.fillMaxSize()) {
  10. items(state.newsArticles) { item ->
  11. AsyncImage(model = item?.image, contentDescription = null)
  12. item?.title?.let { Text(text = it) }
  13. }
  14. }
  15. if(state.error.isNotBlank()) {
  16. Text(
  17. text = state.error,
  18. color = MaterialTheme.colorScheme.error,
  19. textAlign = TextAlign.Center,
  20. modifier = Modifier
  21. .fillMaxWidth()
  22. .padding(horizontal = 20.dp)
  23. .align(Alignment.Center)
  24. )
  25. }
  26. if(state.isLoading) {
  27. CircularProgressIndicator(modifier = Modifier.align(Alignment.Center))
  28. }
  29. }
  30. }

我将感激你的帮助!

niwlg2el

niwlg2el1#

虽然我从来没有使用过Jetpack Compose,但我很确定emit(Resource.Success(temp))调用现在发生在加载数据之前。尝试将其移动到回调函数中:

  1. return flow{
  2. emit(Resource.Loading())
  3. db.collection("newsArticles").get()
  4. .addOnSuccessListener { queryDocumentSnapshots ->
  5. if (!queryDocumentSnapshots.isEmpty) {
  6. val list = queryDocumentSnapshots.documents
  7. for (d in list) {
  8. val c: NewsArticle? = d.toObject(NewsArticle::class.java)
  9. newsList.add(c)
  10. }
  11. temp = newsList
  12. emit(Resource.Success(temp))
  13. }
  14. }
  15. }.catch {
  16. emit(Resource.Error(it.message.toString()))
  17. }
展开查看全部

相关问题