喷气背包撰写 - 单击懒惰列的项目时应用程序崩溃



我最近开始用Jetpack Compose编写代码,但现在我遇到了问题。

我的目标是当点击LazyColumn的项目时,它将导航并在细节屏幕上显示信息。

当我使用普通对象时,代码运行良好。但是对于我的大学作业,我需要从Firebase获取数据并使用MVVM模式显示它。

下面是我的代码:
@Composable
fun DetailsUI(navController: NavController, articleId: String?,viewModel: ArticleViewModel = hiltViewModel()) {
var expanded = remember { mutableStateOf(false) }
val articleResponse = viewModel.articleState.value
Scaffold(
) {
when (articleResponse) {
is Loading -> ProgressBar()
is Success ->Column(){
var newArticle = articleResponse.data.filter { article -> //the problem area that logs indicated
article.id==articleId
}
ArticleHeader(image =newArticle[0].image)
ArticleTitle(title =newArticle[0].title , author = newArticle[0].author )
ArticleContent(content =newArticle[0].title )
}


is Error -> Utils.printError(articleResponse.message)
}
}
}

ViewModel代码:

@HiltViewModel
class ArticleViewModel @Inject constructor(
private val useCases: UseCases
):ViewModel() {
private val _articleState = mutableStateOf<Response<List<Article>>>(Response.Loading)
val articleState: State<Response<List<Article>>> = _articleState
init {
getArticles()
}
private fun getArticles() {
viewModelScope.launch {
useCases.getArticle().collect { response ->
_articleState.value = response
}
}
}

日志:

2022-06-09 00:43:35.248 12215-12215/com.example.flow E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.flow, PID: 12215
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.get(ArrayList.java:437)
at com.example.flow.DetailScreenKt$DetailsUI$2.invoke(DetailScreen.kt:99)
at com.example.flow.DetailScreenKt$DetailsUI$2.invoke(DetailScreen.kt:92)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:116)
at androidx.compose.runtime.internal.ComposableLambdaImpl$invoke$1.invoke(ComposableLambda.jvm.kt:127)
at androidx.compose.runtime.internal.ComposableLambdaImpl$invoke$1.invoke(ComposableLambda.jvm.kt:127)
at androidx.compose.runtime.RecomposeScopeImpl.compose(RecomposeScopeImpl.kt:140)
at androidx.compose.runtime.ComposerImpl.recomposeToGroupEnd(Composer.kt:2158)
at androidx.compose.runtime.ComposerImpl.skipCurrentGroup(Composer.kt:2404)
at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:2585)
at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:2571)
at androidx.compose.runtime.SnapshotStateKt__DerivedStateKt.observeDerivedStateRecalculations(DerivedState.kt:247)
at androidx.compose.runtime.SnapshotStateKt.observeDerivedStateRecalculations(Unknown Source:1)
at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:2571)
at androidx.compose.runtime.ComposerImpl.recompose$runtime_release(Composer.kt:2547)
at androidx.compose.runtime.CompositionImpl.recompose(Composition.kt:620)
at androidx.compose.runtime.Recomposer.performRecompose(Recomposer.kt:786)
at androidx.compose.runtime.Recomposer.access$performRecompose(Recomposer.kt:105)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:456)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:425)
at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:34)
at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:109)
at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.android.kt:41)
at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:947)
at android.view.Choreographer.doCallbacks(Choreographer.java:761)
at android.view.Choreographer.doFrame(Choreographer.java:693)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [androidx.compose.runtime.PausableMonotonicFrameClock@dde2781, StandaloneCoroutine{Cancelling}@6665026, AndroidUiDispatcher@95fe467]

也许,过滤articleResponse不是一个最好的主意,但是我不想提供一个额外的方法来从Firebase检索一篇文章,所以过滤是一个更简单的解决方案。尽管如此,我还是很乐意接受这样的解决方案,即允许我的想法而不会使我的应用程序崩溃。

由于响应中不包含您正在查找的文章,而您的代码假定它就在那里,因此您将遇到崩溃。

改变这

var newArticle = articleResponse.data.filter {       
article.id==articleId
}

val newArticle = articleResponse.data.firstOrNull {       
article.id==articleId
}
if (newArticle != null) {
// display article
} else {
// display Article not found error
}

最新更新