spotube/.agents/skills/verifying_compose_ui/references/troubleshooting.md
2026-06-30 17:00:13 +06:00

88 lines
4.1 KiB
Markdown

# Troubleshooting Compose in REPL
Common issues when rendering Compose components in the REPL and how to resolve them.
## Kotlin Multiplatform (KMP) Issues
The Gradle REPL only supports JVM-based source sets.
- **Issue**: Attempting to start the REPL on a common, iOS, or Android source set fails.
- **Solution**: Select a JVM or Desktop target source set. Recommended names: `jvmMain`, `jvmTest`, `desktopMain`, `desktopTest`.
- **Issue**: Dependencies from `commonMain` are not resolving.
- **Solution**: Starting the REPL on a JVM-specific source set that *depends* on `commonMain` (which is standard KMP structure) will include all inherited dependencies. Ensure the project is built before starting.
## Android Limitation (FUNDAMENTAL)
**IMPORTANT: `runComposeUiTest` and `captureToImage()` CANNOT work on Android.**
This is not a bug or limitation that can be fixed—it is a fundamental architectural incompatibility:
- `runComposeUiTest` requires desktop Compose runtime with Skiko rendering
- Android's ART does not support desktop Compose testing APIs
- `captureToImage()` relies on desktop-specific rendering pipelines
**Solution**: Put your Composables in `commonMain` and run the REPL on a JVM target (`jvmMain`, `jvmTest`, `desktopMain`, or `desktopTest`).
## `ClassNotFoundException: androidx.compose.ui.test.junit4.DesktopComposeTestRule`
This occurs when the Compose UI Test dependencies are not on the REPL's classpath.
The REPL uses the runtime classpath of the selected `sourceSet`.
If you are using `sourceSet: "main"`, but the test dependencies are in `testImplementation`, they won't be included.
**Solutions:**
1. **(Preferred)** Start the REPL with `sourceSet: "test"`. This usually includes the required test dependencies.
2. Add the dependency manually using `additionalDependencies` if using `sourceSet: "main"`:
```json
{
"command": "start",
"projectPath": ":my-app",
"sourceSet": "main",
"additionalDependencies": ["org.jetbrains.compose.ui:ui-test-junit4-desktop:1.7.0"]
}
```
## `java.lang.NoClassDefFoundError: org/jetbrains/skiko/SkiaLayer`
Skiko is the rendering engine for Compose Desktop. It might be missing if the project is not correctly configured for Compose Desktop or if dependencies are incomplete.
**Solution:**
Ensure `compose.desktop.currentOs` is in the project's dependencies or add it to `additionalDependencies`.
## Composable Renders but No Image is Shown
The `project_repl` tool only returns content that is explicitly rendered via `responder.render(value)` or the result of the last expression in the script.
**Solution:**
Ensure you call `responder.render(bitmap)` inside your `runComposeUiTest` block.
```kotlin
runComposeUiTest {
setContent { MyComposable() }
responder.render(onRoot().captureToImage()) // <--- Important!
}
```
## `Unresolved reference: runComposeUiTest`
The `runComposeUiTest` function may be located in different packages depending on your version of Compose or whether you are using JetBrains Compose.
**Solutions:**
1. Check the correct import for your project. Common ones:
- `androidx.compose.ui.test.runComposeUiTest`
- `org.jetbrains.compose.ui.test.runComposeUiTest` (for older or specific JetBrains Compose versions)
2. Ensure you are using a compatible version of the `ui-test` library. Some older versions used `runDesktopComposeUiTest` or similar.
## `Unresolved reference: responder`
The `responder` property is automatically injected into the REPL session by the worker.
If it is unresolved, check if you have a custom `providedProperties` in your script configuration (usually not an issue for users).
Ensure you are using the `project_repl` tool which uses the custom REPL worker.
## `java.lang.IllegalStateException: runComposeUiTest { ... } needs to be called from the main thread`
On some platforms, Compose UI tests might require being run on the main/UI thread.
The REPL evaluates snippets on a background thread. `runComposeUiTest` usually handles its own thread management, but if you encounter this, try wrapping your code in a `SwingUtilities.invokeLater` (for Desktop) if applicable, though
`runComposeUiTest` should be sufficient.