标签: android-jetpack-compose-preview

无法再查看 Jetpack Compose 预览。无法实例化一个或多个类 (ComposeViewAdapter)

我最近遇到一个错误,导致任何 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

39
推荐指数
2
解决办法
1万
查看次数

如何在横向模式下预览 Compose 布局

我使用的是 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().

有任何想法吗?

android-jetpack-compose android-jetpack-compose-preview

20
推荐指数
2
解决办法
8215
查看次数

Jetpack Compose 预览版在 Arctic Fox 中停止使用补丁 1

随着 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

20
推荐指数
1
解决办法
3408
查看次数

在 Jetpack Compose 中跨可组合函数重复使用一组预览注释

在 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 次,这是绝对不正确的。

注释继承是被禁止的,所以我的问题是:是否有人找到了在所有可组合函数中重用同一组预览的方法?

我能想到的唯一的两个解决方案是:

  • 在开发时使用多个自定义预览。
  • 部分重用预览 - 使用名称和组的编译时常量。

编辑:

我创建了一个功能请求来组成团队,以便能够创建自定义注释并使用我想要重用的所有预览来注释注释。

这样我只需要使用我的自定义注释。

可以在Google 问题跟踪器中进行跟踪

android android-jetpack-compose android-jetpack-compose-preview

18
推荐指数
1
解决办法
2066
查看次数

Jetpack Compose 状态提升、预览和 ViewModel 最佳实践

因此,Jetpack Compose 中的建议似乎是从可组合项中提升状态,使它们成为无状态、可重用和可测试,并允许在预览中轻松使用它们。\n因此,不要使用类似的东西

\n
@Composable\nfun MyInputField() {\n    var text by remember { mutableStateOf("") }\n    TextField(value = text, onValueChange = { text = it })\n}\n
Run Code Online (Sandbox Code Playgroud)\n

你会像这样提升状态

\n
@Composable\nfun MyInputField(text: String, onTextChange: (String) -> Unit) {\n    TextField(value = text, onValueChange = onTextChange)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这很好,但是一些更复杂的用途呢?\n让我们假设我有一个由可组合项表示的屏幕,在 View 和 ViewModel 之间具有多种交互。该屏幕分为多个内部可组合项(例如,一个用于标题,一个用于正文,而正文又分为几个较小的可组合项)

\n
    \n
  • 您无法在可组合项中创建 ViewModel(viewModel()至少可以手动实例化一个)并在Preview(预览版不支持像这样创建视图模型)中使用此可组合项
  • \n
  • 在内部可组合项中使用 ViewModel 将使它们成为有状态的,不是吗?
  • \n
\n

因此,我看到的“最干净”的解决方案是仅在最高可组合级别实例化我的视图模型,然后仅将val表示状态的 s 传递给子可组合项,并回调 ViewModel 函数。

\n

但这很疯狂,我不会通过单独的参数将所有 ViewModel 状态和函数传递给所有需要它们的可组合项。\n将它们分组到一个data class示例中可能是一个解决方案

\n
data class UiState(\n  val …
Run Code Online (Sandbox Code Playgroud)

android state kotlin android-jetpack-compose android-jetpack-compose-preview

13
推荐指数
1
解决办法
3518
查看次数

JetpackCompose 中 @Preview 的 isInEditMode 模拟

我正在使用 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

12
推荐指数
2
解决办法
1997
查看次数

使用 Koin 进行依赖注入时,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

12
推荐指数
1
解决办法
4120
查看次数

Studio BumbleBee 撰写预览的“渲染问题”

我无法在 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

11
推荐指数
1
解决办法
9481
查看次数

投射 LocalContext.current 时的 Jetpack Compose 预览渲染问题

Android Studio Chipmunk 2021.2.1; \nCompose Version = \'1.1.1\'; \nGradle  Version 7.4.2; \nKotlin 1.6.10;\n
Run Code Online (Sandbox Code Playgroud)\n

直到某一时刻,一切都正常。然后,当我尝试在此项目和另一个项目中调用“LocalContext.current”并将“context.applicationContext 作为应用程序”时,出现此错误并且预览停止工作。它曾经与“LocalContext.current”一起使用的地方

\n

尝试过不同版本的 Compose、kotlin、gradle。

\n

渲染问题

\n
\n

java.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
\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 }\n
Run Code Online (Sandbox Code Playgroud)\n

kotlin android-studio android-jetpack-compose android-jetpack-compose-preview

6
推荐指数
1
解决办法
7941
查看次数

预览 java.lang.NoSuchMethodError: androidx.compose.foundation.layout.SizeKt.fillMaxWidth$default

我开始将代码迁移到 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

6
推荐指数
1
解决办法
1019
查看次数