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.content.Contextwrapper.getResources(Contextwrapper.java:97) 在 android.view.ContextThemeWrapper.getResourcesInternal(ContextThemeWrapper.java:134) 在 android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:128) 在 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.runtime.internal.ComposableLambda.invoke(ComposableLambda.kt:155) 在 androidx.compose.runtime.internal.ComposableLambda.invoke(ComposableLambda.kt) 在 androidx.compose.foundation.ScrollKt.ScrollableColumn(Scroll.kt:528) 在 com.example.mvvmapp.MainActivity.createViews(MainActivity.kt:34) 在 com.example.mvvmapp.MainActivity.defaultPreview(MainActivity.kt:89) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 方法)在 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) 在 androidx.compose.ui.tooling.preview.PreviewUtilsKt.invokeComposableViaReflection(PreviewUtils.kt:185) 在 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) 在 androidx.compose.ui.tooling.preview.ComposeViewAdapter$init$3$2.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) 在 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) 在 androidx.compose.ui.tooling.preview.ComposeViewAdapter.WrapPreview(ComposeViewAdapter.kt:383) 在 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) 在 androidx.compose.ui.platform.AmbientsKt.ProvideCommonAmbients(Ambients.kt:276) 在 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) 在 androidx.compose.ui.platform.WrappedComposition$setContent$1$1$3.invoke(Wrapper.kt:261) 在 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) 在 androidx.compose.runtime.Composer.composeInitial(Composer.kt:2046) 在 androidx.compose.runtime.recomposer.composeInitial$runtime_release(recomposer.kt:566) 在 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.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3496) 在 android.view.AttachInfo_Accessor.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) 在 com.android.tools.idea.rendering.RenderExecutor$runAsyncActionWithTimeout$2.run(RenderExecutor.kt:187) 在 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"

解决方法

预览适用于我使用 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?