Suwayomi / Suwayomi-JUI

A Suwayomi-Server client built in Compose Multiplatform
Mozilla Public License 2.0
414 stars 26 forks source link

[Bug] Key 0 was already used. If you are using LazyColumn/Row please make sure you provide a unique key for each item #59

Closed ghost closed 2 years ago

ghost commented 2 years ago

Device information

Steps to reproduce

  1. Install a extension
  2. Try to use it in the source section
  3. it will shows "key 0 was used. if you are using lazycolumn/row please make sure you provide a unique key for each item"

Expected behavior

View the section for select a manga

Actual behavior

it open a window with the "key 0 was used. if you are using lazycolumn/row please make sure you provide a unique key for each item" message

Other details

Here some logs

WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
22:36:37.374 [DefaultDispatcher-worker-2] INFO/: Starting server with /usr/lib/jvm/java-18-openjdk/bin/java
22:36:37.379 [DefaultDispatcher-worker-2] INFO/: Using server properties:
-Dsuwayomi.tachidesk.config.server.systemTrayEnabled=false
-Dsuwayomi.tachidesk.config.server.webUIEnabled=false
-Dsuwayomi.tachidesk.config.server.initialOpenInBrowserEnabled=false
22:36:37.390 [DefaultDispatcher-worker-2] INFO/: Server started successfully
22:36:37.909 [DefaultDispatcher-worker-2] INFO/Server: 22:36:37.902 [main] INFO  suwayomi.tachidesk.server.ServerSetup - Running Tachidesk v0.6.3 revision r629
22:36:38.424 [DefaultDispatcher-worker-2] INFO/Server: 22:36:38.424 [main] INFO  suwayomi.tachidesk.server.util.AppMutex - Mutex status is clear, Resuming startup.
22:36:38.626 [DefaultDispatcher-worker-1] INFO/HttpClient: REQUEST: https://api.github.com/repos/Suwayomi/Tachidesk-JUI/releases/latest
22:36:38.629 [DefaultDispatcher-worker-1] INFO/HttpClient: METHOD: HttpMethod(value=GET)
22:36:39.038 [DefaultDispatcher-worker-2] INFO/Server: 22:36:39.038 [main] INFO  de.neonew.exposed.migrations.RunMigrations - Running migrations on database jdbc:h2:/home/aldair/.local/share/Tachidesk/database
22:36:39.408 [DefaultDispatcher-worker-2] INFO/Server: 22:36:39.408 [main] INFO  de.neonew.exposed.migrations.RunMigrations - Database version before migrations: 19
22:36:39.409 [DefaultDispatcher-worker-2] INFO/Server: 22:36:39.408 [main] INFO  de.neonew.exposed.migrations.RunMigrations - Migrations finished successfully
22:36:39.847 [DefaultDispatcher-worker-2] INFO/Server: 22:36:39.846 [main] INFO  io.javalin.Javalin - 
22:36:39.847 [DefaultDispatcher-worker-2] INFO/Server:        __                      __ _            __ __
22:36:39.847 [DefaultDispatcher-worker-2] INFO/Server:       / /____ _ _   __ ____ _ / /(_)____      / // /
22:36:39.847 [DefaultDispatcher-worker-2] INFO/Server:  __  / // __ `/| | / // __ `// // // __ \    / // /_
22:36:39.847 [DefaultDispatcher-worker-2] INFO/Server: / /_/ // /_/ / | |/ // /_/ // // // / / /   /__  __/
22:36:39.847 [DefaultDispatcher-worker-2] INFO/Server: \____/ \__,_/  |___/ \__,_//_//_//_/ /_/      /_/
22:36:39.847 [DefaultDispatcher-worker-2] INFO/Server: 
22:36:39.848 [DefaultDispatcher-worker-2] INFO/Server:           https://javalin.io/documentation
22:36:39.848 [DefaultDispatcher-worker-2] INFO/Server: 
22:36:39.856 [DefaultDispatcher-worker-2] INFO/Server: 22:36:39.855 [main] INFO  io.javalin.Javalin - Starting Javalin ...
22:36:39.869 [DefaultDispatcher-worker-2] INFO/Server: 22:36:39.868 [main] INFO  io.javalin.Javalin - You are running Javalin 4.2.0 (released January 2, 2022. Your Javalin version is 200 days old. Consider checking for a newer version.).
22:36:39.992 [DefaultDispatcher-worker-2] INFO/Server: 22:36:39.992 [main] INFO  io.javalin.Javalin - Listening on http://0.0.0.0:4567/
22:36:39.992 [DefaultDispatcher-worker-2] INFO/Server: 22:36:39.992 [main] INFO  io.javalin.Javalin - Javalin started in 137ms \o/
22:36:40.056 [DefaultDispatcher-worker-3] INFO/HttpClient: REQUEST: ws://localhost:4567/api/v1/downloads
22:36:40.057 [DefaultDispatcher-worker-3] INFO/HttpClient: METHOD: HttpMethod(value=GET)
22:36:40.207 [DefaultDispatcher-worker-3] INFO/HttpClient: RESPONSE: 101 Switching Protocols
22:36:40.208 [DefaultDispatcher-worker-3] INFO/HttpClient: METHOD: HttpMethod(value=GET)
22:36:40.208 [DefaultDispatcher-worker-3] INFO/HttpClient: FROM: ws://localhost:4567/api/v1/downloads
22:36:40.247 [DefaultDispatcher-worker-5] INFO/HttpClient: RESPONSE: 200 
22:36:40.247 [DefaultDispatcher-worker-5] INFO/HttpClient: METHOD: HttpMethod(value=GET)
22:36:40.248 [DefaultDispatcher-worker-5] INFO/HttpClient: FROM: https://api.github.com/repos/Suwayomi/Tachidesk-JUI/releases/latest
22:36:40.717 [DefaultDispatcher-worker-4] INFO/HttpClient: REQUEST: http://localhost:4567/api/v1/category/
22:36:40.718 [DefaultDispatcher-worker-4] INFO/HttpClient: METHOD: HttpMethod(value=GET)
22:36:41.012 [DefaultDispatcher-worker-4] INFO/HttpClient: RESPONSE: 200 OK
22:36:41.012 [DefaultDispatcher-worker-4] INFO/HttpClient: METHOD: HttpMethod(value=GET)
22:36:41.013 [DefaultDispatcher-worker-4] INFO/HttpClient: FROM: http://localhost:4567/api/v1/category/
22:36:41.045 [AWT-EventQueue-0] WARN/: Error getting categories
java.lang.Exception: Library is empty
    at ca.gosyer.jui.ui.library.LibraryScreenViewModel$getLibrary$1.invokeSuspend(LibraryScreenViewModel.kt:131) ~[tachidesk-jui.jar:?]
    at ca.gosyer.jui.ui.library.LibraryScreenViewModel$getLibrary$1.invoke(LibraryScreenViewModel.kt) ~[tachidesk-jui.jar:?]
    at ca.gosyer.jui.ui.library.LibraryScreenViewModel$getLibrary$1.invoke(LibraryScreenViewModel.kt) ~[tachidesk-jui.jar:?]
    at kotlinx.coroutines.flow.FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2.emit(Emitters.kt:223) ~[tachidesk-jui.jar:?]
    at kotlinx.coroutines.flow.FlowKt__ChannelsKt.emitAllImpl$FlowKt__ChannelsKt(Channels.kt:62) ~[tachidesk-jui.jar:?]
    at kotlinx.coroutines.flow.FlowKt__ChannelsKt.access$emitAllImpl$FlowKt__ChannelsKt(Channels.kt:1) ~[tachidesk-jui.jar:?]
    at kotlinx.coroutines.flow.FlowKt__ChannelsKt$emitAllImpl$1.invokeSuspend(Channels.kt) ~[tachidesk-jui.jar:?]
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) ~[tachidesk-jui.jar:?]
    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) ~[tachidesk-jui.jar:?]
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318) ~[?:?]
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773) ~[?:?]
    at java.awt.EventQueue$4.run(EventQueue.java:720) ~[?:?]
    at java.awt.EventQueue$4.run(EventQueue.java:714) ~[?:?]
    at java.security.AccessController.doPrivileged(AccessController.java:399) ~[?:?]
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) ~[?:?]
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:742) ~[?:?]
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) ~[?:?]
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) ~[?:?]
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) ~[?:?]
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) ~[?:?]
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) ~[?:?]
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) ~[?:?]
22:37:52.214 [DefaultDispatcher-worker-8] INFO/HttpClient: REQUEST: http://localhost:4567/api/v1/source/list
22:37:52.214 [DefaultDispatcher-worker-8] INFO/HttpClient: METHOD: HttpMethod(value=GET)
22:37:52.344 [DefaultDispatcher-worker-7] INFO/HttpClient: RESPONSE: 200 OK
22:37:52.344 [DefaultDispatcher-worker-7] INFO/HttpClient: METHOD: HttpMethod(value=GET)
22:37:52.345 [DefaultDispatcher-worker-7] INFO/HttpClient: FROM: http://localhost:4567/api/v1/source/list
22:37:52.472 [DefaultDispatcher-worker-5] INFO/HttpClient: REQUEST: http://localhost:4567/api/v1/extension/icon/localSource
22:37:52.472 [DefaultDispatcher-worker-5] INFO/HttpClient: METHOD: HttpMethod(value=GET)
22:37:52.473 [DefaultDispatcher-worker-8] INFO/HttpClient: REQUEST: http://localhost:4567/api/v1/extension/icon/tachiyomi-es.lectormanga-v1.3.25.apk
22:37:52.473 [DefaultDispatcher-worker-8] INFO/HttpClient: METHOD: HttpMethod(value=GET)
22:37:52.511 [DefaultDispatcher-worker-6] INFO/HttpClient: RESPONSE: 200 OK
22:37:52.511 [DefaultDispatcher-worker-6] INFO/HttpClient: METHOD: HttpMethod(value=GET)
22:37:52.512 [DefaultDispatcher-worker-6] INFO/HttpClient: FROM: http://localhost:4567/api/v1/extension/icon/localSource
22:37:52.596 [DefaultDispatcher-worker-8] INFO/HttpClient: RESPONSE: 200 OK
22:37:52.598 [DefaultDispatcher-worker-8] INFO/HttpClient: METHOD: HttpMethod(value=GET)
22:37:52.598 [DefaultDispatcher-worker-8] INFO/HttpClient: FROM: http://localhost:4567/api/v1/extension/icon/tachiyomi-es.lectormanga-v1.3.25.apk
22:37:53.216 [DefaultDispatcher-worker-4] INFO/HttpClient: REQUEST: http://localhost:4567/api/v1/source/7925520943983324764/filters?reset=true
22:37:53.216 [DefaultDispatcher-worker-4] INFO/HttpClient: METHOD: HttpMethod(value=GET)
22:37:53.217 [DefaultDispatcher-worker-7] INFO/HttpClient: REQUEST: http://localhost:4567/api/v1/source/7925520943983324764/popular/1
22:37:53.217 [DefaultDispatcher-worker-7] INFO/HttpClient: METHOD: HttpMethod(value=GET)
22:37:53.318 [DefaultDispatcher-worker-3] INFO/HttpClient: RESPONSE: 200 OK
22:37:53.319 [DefaultDispatcher-worker-3] INFO/HttpClient: METHOD: HttpMethod(value=GET)
22:37:53.319 [DefaultDispatcher-worker-3] INFO/HttpClient: FROM: http://localhost:4567/api/v1/source/7925520943983324764/filters?reset=true
22:37:53.493 [AWT-EventQueue-0] ERROR/UncaughtException: Uncaught exception in thread [AWT-EventQueue-0@35]
java.lang.IllegalArgumentException: Key 0 was already used. If you are using LazyColumn/Row please make sure you provide a unique key for each item.
    at androidx.compose.ui.layout.SubcomposeLayoutState.subcompose$ui(SubcomposeLayout.kt:214) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.layout.SubcomposeLayoutState$Scope.subcompose(SubcomposeLayout.kt:490) ~[tachidesk-jui.jar:?]
    at androidx.compose.foundation.lazy.layout.LazyLayoutPlaceablesProvider.getAndMeasure-0kLqBqw(LazyMeasurePolicy.kt:58) ~[tachidesk-jui.jar:?]
    at androidx.compose.foundation.lazy.list.LazyMeasuredItemProvider.getAndMeasure-oA9-DU0(LazyMeasuredItemProvider.kt:45) ~[tachidesk-jui.jar:?]
    at androidx.compose.foundation.lazy.list.LazyListMeasureKt.measureLazyList-wroFCeY(LazyListMeasure.kt:145) ~[tachidesk-jui.jar:?]
    at androidx.compose.foundation.lazy.list.LazyListKt$rememberLazyListMeasurePolicy$1$1.measure-3p2s80s(LazyList.kt:259) ~[tachidesk-jui.jar:?]
    at androidx.compose.foundation.lazy.layout.LazyLayoutKt$LazyLayout$2.invoke-0kLqBqw(LazyLayout.kt:55) ~[tachidesk-jui.jar:?]
    at androidx.compose.foundation.lazy.layout.LazyLayoutKt$LazyLayout$2.invoke(LazyLayout.kt:44) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.layout.SubcomposeLayoutState$createMeasurePolicy$1.measure-3p2s80s(SubcomposeLayout.kt:355) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.InnerPlaceable.measure-BRTryo0(InnerPlaceable.kt:55) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:131) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:131) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:131) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:131) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:131) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:131) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:131) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.graphics.SimpleGraphicsLayerModifier.measure-3p2s80s(GraphicsLayerModifier.kt:306) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.kt:39) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.DelegatingLayoutNodeWrapper.measure-BRTryo0(DelegatingLayoutNodeWrapper.kt:131) ~[tachidesk-jui.jar:?]
    at androidx.compose.foundation.layout.FillModifier.measure-3p2s80s(Size.kt:658) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.ModifiedLayoutNode.measure-BRTryo0(ModifiedLayoutNode.kt:39) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$2.invoke(OuterMeasurablePlaceable.kt:99) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.OuterMeasurablePlaceable$remeasure$2.invoke(OuterMeasurablePlaceable.kt:98) ~[tachidesk-jui.jar:?]
    at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.kt:1798) ~[tachidesk-jui.jar:?]
    at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:121) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui(OwnerSnapshotObserver.kt:88) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui(OwnerSnapshotObserver.kt:76) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.OuterMeasurablePlaceable.remeasure-BRTryo0(OuterMeasurablePlaceable.kt:98) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui(LayoutNode.kt:1317) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui$default(LayoutNode.kt:1313) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.MeasureAndLayoutDelegate.doRemeasure(MeasureAndLayoutDelegate.kt:170) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:228) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.MeasureAndLayoutDelegate.access$remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:38) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:201) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.platform.SkiaBasedOwner.measureAndLayout(SkiaBasedOwner.skiko.kt:245) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.node.Owner$DefaultImpls.measureAndLayout$default(Owner.kt:182) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.ComposeScene.render(ComposeScene.skiko.kt:381) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.awt.ComposeLayer$1$onRender$1.invoke(ComposeLayer.desktop.kt:236) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.awt.ComposeLayer$1$onRender$1.invoke(ComposeLayer.desktop.kt:235) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.awt.ComposeLayer.catchExceptions(ComposeLayer.desktop.kt:88) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.awt.ComposeLayer.access$catchExceptions(ComposeLayer.desktop.kt:69) ~[tachidesk-jui.jar:?]
    at androidx.compose.ui.awt.ComposeLayer$1.onRender(ComposeLayer.desktop.kt:235) ~[tachidesk-jui.jar:?]
    at org.jetbrains.skiko.SkiaLayer.update$skiko(SkiaLayer.awt.kt:455) ~[tachidesk-jui.jar:?]
    at org.jetbrains.skiko.redrawer.LinuxOpenGLRedrawer.update(LinuxOpenGLRedrawer.kt:86) ~[tachidesk-jui.jar:?]
    at org.jetbrains.skiko.redrawer.LinuxOpenGLRedrawer.access$update(LinuxOpenGLRedrawer.kt:7) ~[tachidesk-jui.jar:?]
    at org.jetbrains.skiko.redrawer.LinuxOpenGLRedrawer$Companion$frameDispatcher$1.invokeSuspend(LinuxOpenGLRedrawer.kt:112) ~[tachidesk-jui.jar:?]
    at org.jetbrains.skiko.redrawer.LinuxOpenGLRedrawer$Companion$frameDispatcher$1.invoke(LinuxOpenGLRedrawer.kt) ~[tachidesk-jui.jar:?]
    at org.jetbrains.skiko.redrawer.LinuxOpenGLRedrawer$Companion$frameDispatcher$1.invoke(LinuxOpenGLRedrawer.kt) ~[tachidesk-jui.jar:?]
    at org.jetbrains.skiko.FrameDispatcher$job$1.invokeSuspend(FrameDispatcher.kt:33) ~[tachidesk-jui.jar:?]
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) ~[tachidesk-jui.jar:?]
    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) ~[tachidesk-jui.jar:?]
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318) ~[?:?]
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773) ~[?:?]
    at java.awt.EventQueue$4.run(EventQueue.java:720) ~[?:?]
    at java.awt.EventQueue$4.run(EventQueue.java:714) ~[?:?]
    at java.security.AccessController.doPrivileged(AccessController.java:399) ~[?:?]
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) ~[?:?]
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:742) ~[?:?]
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) ~[?:?]
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) ~[?:?]
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) ~[?:?]
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) ~[?:?]
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) ~[?:?]
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) ~[?:?]
    Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException
22:37:54.299 [DefaultDispatcher-worker-3] INFO/HttpClient: RESPONSE: 200 OK
22:37:54.300 [DefaultDispatcher-worker-3] INFO/HttpClient: METHOD: HttpMethod(value=GET)
22:37:54.300 [DefaultDispatcher-worker-3] INFO/HttpClient: FROM: http://localhost:4567/api/v1/source/7925520943983324764/popular/1