首页 > 解决方案 > 设计屏幕中的 Jetpack Compose 渲染问题 NullPointer 异常

问题描述

我创建了一个活动,当我运行时,我在我的 android 设备上看到了结果,但我无法@Preview @Composable在设计屏幕中使用注释看到结果,而且我总是看到渲染问题。有空指针异常。

主要活动

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            createViews();
        }
    }

    @Composable
    fun createViews(){
        ScrollableColumn(
                modifier = Modifier
                        .fillMaxSize()
                        .background(color = Color(0xFFf2f2f2))

        )

        {
            Image(
                    bitmap = imageFromResource(res = resources,resId = R.drawable.logo_2),
                    modifier = Modifier
                            .size(100.dp, 200.dp)
                            .align(alignment = Alignment.CenterHorizontally),
                    contentScale = ContentScale.Crop

            )

            Column(
                    Modifier.padding(20.dp)
            ) {
                Text(
                        text = "Archi",
                        style = TextStyle(
                                color = Color(0xFFffd600),
                                fontSize = TextUnit.Companion.Sp(20)
                        )
                )
                Spacer(modifier = Modifier.padding(10.dp))
                Text(
                        text = "test",
                        style = TextStyle(
                                color = Color(0xFFf4511e),
                                fontSize = TextUnit.Companion.Sp(20)
                        )

                )
                Spacer(modifier = Modifier.padding(10.dp))
                Text(
                        text = "xxx-xxxxxxx",
                        style = TextStyle(
                                color = Color(0xFF00e676),
                                fontSize = TextUnit.Companion.Sp(20)
                        )
                )
            }



        }
    }

    @Preview
    @Composable
    fun defaultPreview(){
        //Conmposable
        createViews();
    }
}

例外:

java.lang.NullPointerException 在 android.view.ContextThemeWrapper.getResourcesInternal(ContextThemeWrapper.java:134) 在 android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:128) 在 android.content.ContextWrapper.getResources(ContextWrapper.java:97)在 androidx.appcompat.app.AppCompatActivity.getResources(AppCompatActivity.java:592) 在 com.example.mvvmapp.MainActivity$createViews$1.invoke(MainActivity.kt:43) 在 com.example.mvvmapp.MainActivity$createViews$1.invoke (MainActivity.kt) 在 androidx.compose.foundation.ScrollKt 的 androidx.compose.runtime.internal.ComposableLambda.invoke(ComposableLambda.kt:155) 的 androidx.compose.runtime.internal.ComposableLambda.invoke(ComposableLambda.kt)。在 com.example.mvvmapp.MainActivity.createViews(MainActivity.kt:34) 在 com.example.mvvmapp.MainActivity 的 ScrollableColumn(Scroll.kt:528)。java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 的 defaultPreview(MainActivity.kt:89) java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 的 java. base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 在 androidx.compose.ui.tooling.preview。 PreviewUtilsKt.invokeComposableMethod(PreviewUtils.kt:141) at androidx.compose.ui.tooling.preview.PreviewUtilsKt.invokeComposableViaReflection(PreviewUtils.kt:185) at androidx.compose.ui.tooling.preview.ComposeViewAdapter$init$3$2$composable$1 .invoke(ComposeViewAdapter.kt:437) 在 androidx.compose.ui.tooling.preview.ComposeViewAdapter$init$3$2$composable$1.invoke(ComposeViewAdapter.kt) 在 androidx.compose.ui.tooling.preview。ComposeViewAdapter$init$3$2.invoke(ComposeViewAdapter.kt:471) at androidx.compose.ui.tooling.preview.ComposeViewAdapter$init$3$2.invoke(ComposeViewAdapter.kt) at androidx.compose.runtime.internal.ComposableLambda.invoke( ComposableLambda.kt:146) 在 androidx.compose.runtime.internal.ComposableLambda.invoke(ComposableLambda.kt) 在 androidx.compose.runtime.AmbientKt.Providers(Ambient.kt:188) 在 androidx.compose.ui.tooling.InspectableKt .Inspectable(Inspectable.kt:65) 在 androidx.compose.ui.tooling.preview.ComposeViewAdapter$WrapPreview$1.invoke(ComposeViewAdapter.kt:384) 在 androidx.compose.ui.tooling.preview.ComposeViewAdapter$WrapPreview$1.invoke (ComposeViewAdapter.kt) 在 androidx.compose.runtime.internal.ComposableLambda.invoke(ComposableLambda.kt:146) 在 androidx.compose.runtime.internal.ComposableLambda.invoke(ComposableLambda.kt) 在 androidx。compose.runtime.AmbientKt.Providers(Ambient.kt:188) at androidx.compose.ui.tooling.preview.ComposeViewAdapter.WrapPreview(ComposeViewAdapter.kt:383) at androidx.compose.ui.tooling.preview.ComposeViewAdapter.access$ WrapPreview(ComposeViewAdapter.kt) 在 androidx.compose.ui.tooling.preview.ComposeViewAdapter$init$3.invoke(ComposeViewAdapter.kt:430) 在 androidx.compose.ui.tooling.preview.ComposeViewAdapter$init$3.invoke(ComposeViewAdapter. kt) 在 androidx.compose.runtime.internal.ComposableLambda.invoke(ComposableLambda.kt:146) 在 androidx.compose.runtime.internal.ComposableLambda.invoke(ComposableLambda.kt) 在 androidx.compose.ui.platform.ComposeView.Content (ComposeView.kt:293) 在 androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.kt:161) 在 androidx.compose.ui.platform。AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.kt) 在 androidx.compose.runtime.internal.ComposableLambda.invoke(ComposableLambda.kt:146) 在 androidx.compose.runtime.internal.ComposableLambda.invoke(ComposableLambda.kt) 在 androidx。 compose.runtime.AmbientKt.Providers(Ambient.kt:188) at androidx.compose.ui.platform.AmbientsKt.ProvideCommonAmbients(Ambients.kt:276) at androidx.compose.ui.platform.AndroidAmbientsKt$ProvideAndroidAmbients$3.invoke(AndroidAmbients .kt:176) 在 androidx.compose.ui.platform.AndroidAmbientsKt$ProvideAndroidAmbients$3.invoke(AndroidAmbients.kt) 在 androidx.compose.runtime.internal.ComposableLambda.invoke(ComposableLambda.kt:146) 在 androidx.compose.runtime .internal.ComposableLambda.invoke(ComposableLambda.kt) 在 androidx.compose.runtime.AmbientKt.Providers(Ambient.kt:188) 在 androidx.compose.ui。platform.AndroidAmbientsKt.ProvideAndroidAmbients(AndroidAmbients.kt:168) at androidx.compose.ui.platform.WrappedComposition$setContent$1$1$3.invoke(Wrapper.kt:261) at androidx.compose.ui.platform.WrappedComposition$setContent$1$1 $3.invoke(Wrapper.kt) 在 androidx.compose.runtime.internal.ComposableLambda.invoke(ComposableLambda.kt:146) 在 androidx.compose.runtime.internal.ComposableLambda.invoke(ComposableLambda.kt) 在 androidx.compose.runtime .AmbientKt.Providers(Ambient.kt:188) 在 androidx.compose.ui.platform.WrappedComposition$setContent$1$1.invoke(Wrapper.kt:260) 在 androidx.compose.ui.platform.WrappedComposition$setContent$1$1.invoke (Wrapper.kt) 在 androidx.compose.runtime.internal.ComposableLambda.invoke(ComposableLambda.kt:146) 在 androidx.compose.runtime.internal.ComposableLambda.invoke(ComposableLambda.kt) 在 androidx.compose.runtime。ComposerKt.invokeComposable(Composer.kt:2906) at androidx.compose.runtime.Composer.composeInitial(Composer.kt:2046) at androidx.compose.runtime.Recomposer.composeInitial$runtime_release(Recomposer.kt:566) at androidx.compose .runtime.CompositionImpl.setContent(Composition.kt:109) 在 androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.kt:243) 在 androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke (Wrapper.kt) 位于 androidx.compose.ui.platform.AndroidComposeView.setOnViewTreeOwnersAvailable(AndroidComposeView.kt:548) 位于 androidx.compose.ui.platform.WrappedComposition.setContent(Wrapper.kt:234) 位于 androidx.compose.ui。 platform.WrappedComposition.onStateChanged(Wrapper.kt:285) 在 androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:354) 在 androidx.lifecycle.LifecycleRegistry。addObserver(LifecycleRegistry.java:196) 在 androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.kt:241) 在 androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.kt)在 androidx.compose.ui.platform.AndroidComposeView.onAttachedToWindow(AndroidComposeView.kt:617) 在 android.view.View.dispatchAttachedToWindow(View.java:20479) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3489) 在android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3496) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3496) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3496) 在 android.view.ViewGroup .dispatchAttachedToWindow(ViewGroup.java:3496) 在 android.view.AttachInfo_Accessor 的 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3496)。setAttachInfo(AttachInfo_Accessor.java:44) 在 com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:361) 在 com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:431) 在 com .android.tools.idea.layoutlib.LayoutLibrary.createSession(LayoutLibrary.java:141) 在 com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:696) 在 com.android.tools.idea.rendering .RenderTask.lambda$inflate$6(RenderTask.java:852) at com.android.tools.idea.rendering.RenderExecutor$runAsyncActionWithTimeout$2.run(RenderExecutor.kt:187) at java.base/java.util.concurrent.ThreadPoolExecutor .runWorker(ThreadPoolExecutor.java:1128) 在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 在 java.base/java.lang.Thread.run(Thread.java:834 )bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:361) 在 com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:431) 在 com.android.tools.idea.layoutlib.LayoutLibrary.createSession(LayoutLibrary. java:141) 在 com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:696) 在 com.android.tools.idea.rendering.RenderTask.lambda$inflate$6(RenderTask.java:852) 在com.android.tools.idea.rendering.RenderExecutor$runAsyncActionWithTimeout$2.run(RenderExecutor.kt:187) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java .util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 在 java.base/java.lang.Thread.run(Thread.java:834)com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:431) 上的 bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:361) 在 com.android.tools.idea.layoutlib.LayoutLibrary.createSession(LayoutLibrary. java:141) 在 com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:696) 在 com.android.tools.idea.rendering.RenderTask.lambda$inflate$6(RenderTask.java:852) 在com.android.tools.idea.rendering.RenderExecutor$runAsyncActionWithTimeout$2.run(RenderExecutor.kt:187) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java .util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 在 java.base/java.lang.Thread.run(Thread.java:834)java:431) 在 com.android.tools.idea.layoutlib.LayoutLibrary.createSession(LayoutLibrary.java:141) 在 com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:696) 在 com.android .tools.idea.rendering.RenderTask.lambda$inflate$6(RenderTask.java:852) at com.android.tools.idea.rendering.RenderExecutor$runAsyncActionWithTimeout$2.run(RenderExecutor.kt:187) at java.base/java .util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) 在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 在 java.base/java.lang.Thread.run (线程.java:834)java:431) 在 com.android.tools.idea.layoutlib.LayoutLibrary.createSession(LayoutLibrary.java:141) 在 com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:696) 在 com.android .tools.idea.rendering.RenderTask.lambda$inflate$6(RenderTask.java:852) at com.android.tools.idea.rendering.RenderExecutor$runAsyncActionWithTimeout$2.run(RenderExecutor.kt:187) at java.base/java .util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) 在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 在 java.base/java.lang.Thread.run (线程.java:834)lambda$inflate$6(RenderTask.java:852) at com.android.tools.idea.rendering.RenderExecutor$runAsyncActionWithTimeout$2.run(RenderExecutor.kt:187) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker( ThreadPoolExecutor.java:1128) 在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 在 java.base/java.lang.Thread.run(Thread.java:834)lambda$inflate$6(RenderTask.java:852) at com.android.tools.idea.rendering.RenderExecutor$runAsyncActionWithTimeout$2.run(RenderExecutor.kt:187) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker( ThreadPoolExecutor.java:1128) 在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 在 java.base/java.lang.Thread.run(Thread.java:834)

依赖项

def composeVersion  = "1.0.0-alpha10"
    implementation "androidx.compose.ui:ui:$composeVersion"
    // Tooling support (Previews, etc.)
    implementation "androidx.compose.ui:ui-tooling:$composeVersion"
    // Foundation (Border, Background, Box, Image, Scroll, shapes, animations, etc.)
    implementation "androidx.compose.foundation:foundation:$composeVersion"
    // Material Design
    implementation "androidx.compose.material:material:$composeVersion"
    // Material design icons
    implementation "androidx.compose.material:material-icons-core:$composeVersion"
    implementation "androidx.compose.material:material-icons-extended:$composeVersion"
    // Integration with observables
    implementation "androidx.compose.runtime:runtime-livedata:$composeVersion"
    implementation "androidx.compose.runtime:runtime-rxjava2:$composeVersion"

标签: androidandroid-jetpack-compose

解决方案


预览适用于我使用 1.0.0-alpha11。

我不得不添加这个:

val resources = AmbientContext.current.resources

以及图像的内容描述,如下所示:

val resources = AmbientContext.current.resources
        Image(
            contentDescription = "",
            bitmap = imageFromResource(res = resources,resId = R.drawable.image),
            modifier = Modifier
                .size(100.dp, 200.dp)
                .align(alignment = Alignment.CenterHorizontally),
            contentScale = ContentScale.Crop

        )

您确定您使用的是 Android Studio 的金丝雀版本吗?


推荐阅读