我最近遇到一个错误,导致任何 Jetpack Compose 预览无法显示,如下所示:
Failed to instantiate one or more classes
The following classes could not be instantiated:
-androidx.compose.ui.tooling.ComposeViewAdapter(Open Class, Show Exception, Clear Cache)
if this is an unexpected error you can also try to build the project, then manually refresh the layout
java.lang.NoClassDefFoundError: Could not initialize class androidx.customview.poolingcontainer.PoolingContainer
at androidx.compose.ui.platform.ViewCompositionStrategy$DisposeOnDetachedFromWindowIfNotInPoolingContainer.installFor(ViewCompositionStrategy.android.kt:97)
at androidx.compose.ui.platform.AbstractComposeView.<init>(ComposeView.android.kt:123)
at androidx.compose.ui.platform.ComposeView.<init>(ComposeView.android.kt:392)
at androidx.compose.ui.platform.ComposeView.<init>(ComposeView.android.kt:388)
at androidx.compose.ui.tooling.ComposeViewAdapter.<init>(ComposeViewAdapter.kt:131)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
at org.jetbrains.android.uipreview.ViewLoader.createNewInstance(ViewLoader.java:339)
at org.jetbrains.android.uipreview.ViewLoader.loadClass(ViewLoader.java:176)
at org.jetbrains.android.uipreview.ViewLoader.loadView(ViewLoader.java:136)
at com.android.tools.idea.rendering.LayoutlibCallbackImpl.loadView(LayoutlibCallbackImpl.java:301)
at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:417)
at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:428) …Run Code Online (Sandbox Code Playgroud) android android-studio android-jetpack-compose android-jetpack-compose-preview
我使用的是 Android Studio Bumblebee 2021.1.1 Canary 3 + Compose 1.0-rc02,似乎没有简单的方法可以强制使用横向模式进行预览,其中包括使用-land/资源文件夹中的资源(特别是维度)。
我知道这种行为在理论上是可能的,因为 using@Preview(device = Devices.AUTOMOTIVE_1024p)将使用正确的资源值。但是,这不是一个可行的预览选项,因为与默认预览设备相比,像素密度较低。(即使调整预览宽度、高度和字体比例,图标的尺寸仍然错误。)
我能够做到这一点,以便我的 UI 代码使用以下包装器检测横向方向
val lanscapeConfig = LocalConfiguration.current.apply {
orientation = Configuration.ORIENTATION_LANDSCAPE
}
CompositionLocalProvider(LocalConfiguration provides lanscapeConfig) {
// actual preview code
}
Run Code Online (Sandbox Code Playgroud)
然而,这并不能解决上述问题,即无法使用dimensionResource().
有任何想法吗?
随着 AS Arctic Fox Jetpack Compose 的第一个补丁发布,预览停止工作。
我在所有预览中都收到此错误 - 甚至是较旧的预览,不久前运行良好:
android.content.res.Resources$NotFoundException: Could not resolve resource value: [some hex value]
Run Code Online (Sandbox Code Playgroud)
这里有任何快速解决办法吗?清除缓存和常见的东西不起作用。
编辑:
看起来问题并不总是存在。一些预览开始工作,而其他预览仍然失败。
编辑2:
当需要主模块的资源或painterResource()正在使用资源时(即使要显示来自同一模块的资源),这种情况会发生在动态功能模块中。
android-studio android-jetpack-compose android-jetpack-compose-preview android-studio-arctic-fox
在 Jetpack Compose 中迈出第一步,这非常令人惊奇,除了一个恼人的问题。
我有一组固定的预览:正常、深色和 RTL:
@Preview(
name = "Normal",
group = "Screen",
showBackground = true
)
@Preview(
name = "Dark",
group = "Screen",
showBackground = true,
uiMode = Configuration.UI_MODE_NIGHT_YES
)
@Preview(
name = "RTL",
group = "Screen",
showBackground = true,
locale = "iw"
)
@Composable
fun JustAComposable() {
...
}
Run Code Online (Sandbox Code Playgroud)
举个例子,我预览了 50 个可组合函数。我需要将这个集合复制粘贴 50 次,这是绝对不正确的。
注释继承是被禁止的,所以我的问题是:是否有人找到了在所有可组合函数中重用同一组预览的方法?
我能想到的唯一的两个解决方案是:
我创建了一个功能请求来组成团队,以便能够创建自定义注释并使用我想要重用的所有预览来注释注释。
这样我只需要使用我的自定义注释。
android android-jetpack-compose android-jetpack-compose-preview
因此,Jetpack Compose 中的建议似乎是从可组合项中提升状态,使它们成为无状态、可重用和可测试,并允许在预览中轻松使用它们。\n因此,不要使用类似的东西
\n@Composable\nfun MyInputField() {\n var text by remember { mutableStateOf("") }\n TextField(value = text, onValueChange = { text = it })\n}\nRun Code Online (Sandbox Code Playgroud)\n你会像这样提升状态
\n@Composable\nfun MyInputField(text: String, onTextChange: (String) -> Unit) {\n TextField(value = text, onValueChange = onTextChange)\n}\nRun Code Online (Sandbox Code Playgroud)\n这很好,但是一些更复杂的用途呢?\n让我们假设我有一个由可组合项表示的屏幕,在 View 和 ViewModel 之间具有多种交互。该屏幕分为多个内部可组合项(例如,一个用于标题,一个用于正文,而正文又分为几个较小的可组合项)
\nviewModel()至少可以手动实例化一个)并在Preview(预览版不支持像这样创建视图模型)中使用此可组合项因此,我看到的“最干净”的解决方案是仅在最高可组合级别实例化我的视图模型,然后仅将val表示状态的 s 传递给子可组合项,并回调 ViewModel 函数。
但这很疯狂,我不会通过单独的参数将所有 ViewModel 状态和函数传递给所有需要它们的可组合项。\n将它们分组到一个data class示例中可能是一个解决方案
data class UiState(\n val …Run Code Online (Sandbox Code Playgroud) android state kotlin android-jetpack-compose android-jetpack-compose-preview
我正在使用 Jetpack compose 开发一个应用程序,并且在 Jetpack 预览期间遇到字体导入问题。预览为空并显示错误(渲染问题):
Font resource ID #0x... cannot be retrieved
Run Code Online (Sandbox Code Playgroud)
例如,在自定义视图中,我们有一个
isInEditMode
Run Code Online (Sandbox Code Playgroud)
在设计部分控制布局预览,我们可以禁用一些破坏预览的逻辑。
有什么方法可以为 Jetpack @Preview 做到这一点吗?我目前阅读了所有可用的文档/文章,但没有找到答案。
非常感谢您提供任何信息。
Jetpack Compose 代码是:
@Composable
fun ScreenContent() {
Row(
modifier = Modifier
.wrapContentSize()
.fillMaxWidth()
.clip(RoundedCornerShape(50))
.background(colorResource(id = R.color.search_field_background_color)),
horizontalArrangement = Arrangement.Center
) {
Icon(
painterResource(id = R.drawable.ic_search_image), contentDescription = stringResource(R.string.search_screen_magnifier_icon_content_description)
)
Text(
modifier = Modifier.padding(all = 8.dp),
text = stringResource(R.string.search_screen_search_field_text),
fontSize = 12.sp,
color = colorResource(id = R.color.search_field_text_color),
fontFamily = getFont(R.font.nunito_sans_extra_bold)
)
}
}
//according to the plan this method …Run Code Online (Sandbox Code Playgroud) android android-jetpack-compose android-jetpack-compose-preview
我想在我的应用程序中使用 Jetpack Compose。我已经在使用 Koin 进行 DI 了。因为我的 BaseFragment 中有很多方便的方法,所以我想继承它并使用 compose 构建相应的视图。
现在的问题是,当在 BaseFragment 中使用 DI 并继承它时,将不会显示可组合项的预览,并出现以下错误消息:
并抛出以下异常:
java.lang.IllegalStateException: KoinApplication has not been started
at org.koin.core.context.GlobalContext.get(GlobalContext.kt:36)
at org.koin.java.KoinJavaComponent.getKoin(KoinJavaComponent.kt:122)
at org.koin.java.KoinJavaComponent.get(KoinJavaComponent.kt:87)
at org.koin.java.KoinJavaComponent.get$default(KoinJavaComponent.kt:81)
at org.koin.java.KoinJavaComponent.get(KoinJavaComponent.kt)
...
Run Code Online (Sandbox Code Playgroud)
我的 BaseFragment 看起来像这样
public abstract class BaseFragment {
private final ActiveViewIdInteractor activeViewIdInteractor =
new ActiveViewIdInteractor(KoinJavaComponent.get(ActiveViewIdService.class));
...
Run Code Online (Sandbox Code Playgroud)
我继承的片段看起来像这样
class ComposeDemoFragment: BaseFragment() {
...
@Composable
fun ComposeDemoFragmentContent() {
Text(text = "Hello World",
Modifier
.fillMaxWidth()
.background(Color.Cyan)
)
}
@Preview
@Composable
private fun Preview() {
ComposeDemoFragmentContent()
}
Run Code Online (Sandbox Code Playgroud)
如果在不继承自 BaseFragment 的 …
android android-studio koin android-jetpack-compose android-jetpack-compose-preview
我无法在 Studio 中预览任何内容,无法预览像Text. 我收到“渲染错误”,显示了该堆栈跟踪。
java.lang.NoSuchMethodException: com.<packageName>.Navigation_ComponentsKt.<PreviewName>
at androidx.compose.ui.tooling.CommonPreviewUtils.findComposableMethod(CommonPreviewUtils.kt:78)
at androidx.compose.ui.tooling.CommonPreviewUtils.invokeComposableViaReflection$ui_tooling_release(CommonPreviewUtils.kt:183)
at androidx.compose.ui.tooling.ComposeViewAdapter$init$3$1$composable$1.invoke(ComposeViewAdapter.kt:553)
at androidx.compose.ui.tooling.ComposeViewAdapter$init$3$1$composable$1.invoke(ComposeViewAdapter.kt:551)
at androidx.compose.ui.tooling.ComposeViewAdapter$init$3$1.invoke(ComposeViewAdapter.kt:590)
at androidx.compose.ui.tooling.ComposeViewAdapter$init$3$1.invoke(ComposeViewAdapter.kt:546)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:215)
at androidx.compose.ui.tooling.InspectableKt.Inspectable(Inspectable.kt:64)
at androidx.compose.ui.tooling.ComposeViewAdapter$WrapPreview$1.invoke(ComposeViewAdapter.kt:495)
at androidx.compose.ui.tooling.ComposeViewAdapter$WrapPreview$1.invoke(ComposeViewAdapter.kt:494)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:215)
at androidx.compose.ui.tooling.ComposeViewAdapter.WrapPreview(ComposeViewAdapter.kt:490)
at androidx.compose.ui.tooling.ComposeViewAdapter.access$WrapPreview(ComposeViewAdapter.kt:120)
at androidx.compose.ui.tooling.ComposeViewAdapter$init$3.invoke(ComposeViewAdapter.kt:546)
at androidx.compose.ui.tooling.ComposeViewAdapter$init$3.invoke(ComposeViewAdapter.kt:543)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.ui.platform.ComposeView.Content(ComposeView.android.kt:384)
at androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:228)
at androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:227)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:215)
at androidx.compose.ui.platform.CompositionLocalsKt.ProvideCommonCompositionLocals(CompositionLocals.kt:148)
at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3.invoke(AndroidCompositionLocals.android.kt:114)
at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3.invoke(AndroidCompositionLocals.android.kt:113)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:215)
at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt.ProvideAndroidCompositionLocals(AndroidCompositionLocals.android.kt:106)
at androidx.compose.ui.platform.WrappedComposition$setContent$1$1$3.invoke(Wrapper.android.kt:162)
at androidx.compose.ui.platform.WrappedComposition$setContent$1$1$3.invoke(Wrapper.android.kt:161) …Run Code Online (Sandbox Code Playgroud) android-studio android-gradle-plugin android-jetpack-compose android-jetpack-compose-preview
Android Studio Chipmunk 2021.2.1; \nCompose Version = \'1.1.1\'; \nGradle Version 7.4.2; \nKotlin 1.6.10;\nRun Code Online (Sandbox Code Playgroud)\n直到某一时刻,一切都正常。然后,当我尝试在此项目和另一个项目中调用“LocalContext.current”并将“context.applicationContext 作为应用程序”时,出现此错误并且预览停止工作。它曾经与“LocalContext.current”一起使用的地方
\n尝试过不同版本的 Compose、kotlin、gradle。
\n\n\n\njava.lang.ClassCastException: 类\ncom.android.layoutlib.bridge.android.BridgeContext 无法转换为\n类 android.app.Application\n(com.android.layoutlib.bridge.android.BridgeContext 和\nandroid.app.应用程序位于 loader\ncom.intellij.ide.plugins.cl.PluginClassLoader @3a848149) \xc2\xa0\xc2\xa0at\ncom.client.personalfinance.screens.ComposableSingletons$AccountScreenKt$lambda-2$1.invoke( AccountScreen.kt:136)\n\xc2\xa0\xc2\xa0at\ncom.client.personalfinance.screens.ComposableSingletons$AccountScreenKt$lambda-2$1.invoke(AccountScreen.kt:133)\n\xc2\xa0\xc2 \xa0at\nandroidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)\n\xc2\xa0\xc2\xa0at\nandroidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm. kt:34)\n\xc2\xa0\xc2\xa0at\nandroidx.compose.material.MaterialTheme_androidKt.PlatformMaterialTheme(MaterialTheme.android.kt:23)\n\xc2\xa0\xc2\xa0at\nandroidx.compose.material。 MaterialThemeKt$MaterialTheme$1$1.invoke(MaterialTheme.kt:82)\n\xc2\xa0\xc2\xa0at\nandroidx.compose.material.MaterialThemeKt$MaterialTheme$1$1.invoke(MaterialTheme.kt:81)\n\xc2\ xa0\xc2\xa0at\nandroidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)\n\xc2\xa0\xc2\xa0at\nandroidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda .jvm.kt:34)\n\xc2\xa0\xc2\xa0at\nandroidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)\n\xc2\xa0\xc2\xa0at androidx.compose.material。 TextKt.ProvideTextStyle(Text.kt:265
\n
@Preview(showBackground = true) \n@Composable fun PrevAccountScreen() {\n val context = LocalContext.current\n val mViewModel: MainViewModel =\n viewModel(factory = MainVeiwModelFactory(context.applicationContext as Application))\n AccountScreen(navController = rememberNavController(), viewModel = mViewModel)\n }\nRun Code Online (Sandbox Code Playgroud)\n kotlin android-studio android-jetpack-compose android-jetpack-compose-preview
我开始将代码迁移到 Compose,但遇到了 @Preview 问题。例如,当我在modifier.fillMaxWidth()没有默认参数“fraction = 1f”的情况下使用时,我遇到渲染问题
java.lang.NoSuchMethodError: 'androidx.compose.ui.Modifier androidx.compose.foundation.layout.SizeKt.fillMaxWidth$default(androidx.compose.ui.Modifier, java.lang.Float, int, java.lang.Object) '
或使用不带底部参数的填充
.padding(
top = dimensionResource(id = R.dimen._4sdp),
start = dimensionResource(id = R.dimen._16sdp),
end = dimensionResource(id = R.dimen._16sdp)
)
Run Code Online (Sandbox Code Playgroud)
java.lang.NoSuchMethodError: 'androidx.compose.ui.Modifier androidx.compose.foundation.layout.PaddingKt.padding-qDBjuR0$default(androidx.compose.ui.Modifier, androidx.compose.ui.unit.Dp, androidx. compose.ui.unit.Dp、androidx.compose.ui.unit.Dp、androidx.compose.ui.unit.Dp、int、java.lang.Object)'
这是我使用的代码
@Composable
fun Info(
modifier: Modifier = Modifier,
step: String,
stepInfo: String,
) {
Column(modifier = modifier.fillMaxWidth(fraction = 1f)) {
Text(
text = step,
modifier = Modifier
.background(
color = colorResource(id = R.color.color_on_background_variant3),
shape = RoundedCornerShape(90)
)
.size(dimensionResource(id = R.dimen._28sdp))
.padding(dimensionResource(id …Run Code Online (Sandbox Code Playgroud) android android-jetpack-compose android-jetpack-compose-preview android-jetpack-compose-modifier
android-jetpack-compose-preview ×10
android ×6
kotlin ×2
android-jetpack-compose-modifier ×1
koin ×1
state ×1