当应用程序启动时,在我的情况下,屏幕上什么也没有发生(一个没有数据的空白屏幕),但只对logcat中的用户,它显示数据正在从服务器加载。只要我切换到另一个屏幕,数据就会出现一瞬间,然后消失,当我返回到“ForYouScreen”屏幕时,数据就会出现。它应该是:CircularProgressIndicator函数应首先工作,然后显示数据。我提供了下面的代码:
class NewsRepositoryImpl : NewsRepository {
override fun getNewsArticles(): Flow<Resource<List<NewsArticle?>>> {
val newsList: MutableList<NewsArticle?> = mutableListOf()
var temp: List<NewsArticle?>
val db: FirebaseFirestore = FirebaseFirestore.getInstance()
return flow{
emit(Resource.Loading())
db.collection("newsArticles").get()
.addOnSuccessListener { queryDocumentSnapshots ->
if (!queryDocumentSnapshots.isEmpty) {
val list = queryDocumentSnapshots.documents
for (d in list) {
val c: NewsArticle? = d.toObject(NewsArticle::class.java)
newsList.add(c)
}
}
}
temp = newsList
emit(Resource.Success(temp))
}.catch {
emit(Resource.Error(it.message.toString()))
}
}
}
class GetNewsArticlesUseCase(
private val repository: NewsRepository
) {
operator fun invoke(): Flow<Resource<List<NewsArticle?>>> {
return repository.getNewsArticles()
}
}
class ForYouScreenViewModel(
private val getNewsArticlesUseCase: GetNewsArticlesUseCase
) : ViewModel() {
private val _state = mutableStateOf(ForYouState())
val state: State<ForYouState> = _state
init {
loadNewsArticles()
}
private fun loadNewsArticles() {
getNewsArticlesUseCase().onEach { result ->
when(result){
is Resource.Success -> {
_state.value = ForYouState(newsArticles = result.data ?: emptyList())
}
is Resource.Loading -> {
_state.value = ForYouState(isLoading = true)
}
is Resource.Error -> {
_state.value = ForYouState(error = result.message ?: "An unexpected error occurred")
}
}
}.launchIn(viewModelScope)
}
}
data class ForYouState(
val isLoading: Boolean = false,
val newsArticles: List<NewsArticle?> = emptyList(),
val error: String = ""
)
@Composable
fun ForYouScreen(
externalRouter: Router,
lifecycleOwner: LifecycleOwner,
viewModel: ForYouScreenViewModel = koinViewModel()
) {
val state = viewModel.state.value
Box(modifier = Modifier.fillMaxSize()) {
LazyColumn(modifier = Modifier.fillMaxSize()) {
items(state.newsArticles) { item ->
AsyncImage(model = item?.image, contentDescription = null)
item?.title?.let { Text(text = it) }
}
}
if(state.error.isNotBlank()) {
Text(
text = state.error,
color = MaterialTheme.colorScheme.error,
textAlign = TextAlign.Center,
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 20.dp)
.align(Alignment.Center)
)
}
if(state.isLoading) {
CircularProgressIndicator(modifier = Modifier.align(Alignment.Center))
}
}
}
我将感激你的帮助!
1条答案
按热度按时间niwlg2el1#
虽然我从来没有使用过Jetpack Compose,但我很确定
emit(Resource.Success(temp))
调用现在发生在加载数据之前。尝试将其移动到回调函数中: