Android XML 设计工具无法预览 AbstractComposeView 的子类小部件?

6
这是我的代码,一个 AbstractComposeView 类。但是它无法在 XML 设计工具中显示。XML 设计工具显示以下错误消息:
java.lang.IllegalStateException: 未从 androidx.constraintlayout.widget.ConstraintLayout{3deb8822 V.E...... ......ID 0,0-0,0} 找到 ViewTreeLifecycleOwner at androidx.compose.ui.platform.WindowRecomposer_androidKt.createLifecycleAwareViewTreeRecomposer(WindowRecomposer.android.kt:244) at androidx.compose.ui.platform.WindowRecomposer_androidKt.access$createLifecycleAwareViewTreeRecomposer(WindowRecomposer.android.kt:1) at androidx.compose.ui.platform.WindowRecomposerFactory$Companion$LifecycleAware$1.createRecomposer(WindowRecomposer.android.kt:99) at androidx.compose.ui.platform.WindowRecomposerPolicy.createAndInstallWindowRecomposer$ui_release(WindowRecomposer.android.kt:155) at androidx.compose.ui.platform.WindowRecomposer_androidKt.getWindowRecomposer(WindowRecomposer.android.kt:230) at androidx.compose.ui.platform.AbstractComposeView.resolveParentCompositionContext(ComposeView.android.kt:244) at androidx.compose.ui.platform.AbstractComposeView.ensureCompositionCreated(ComposeView.android.kt:251) at androidx.compose.ui.platform.AbstractComposeView.onAttachedToWindow(ComposeView.android.kt:283) at android.view.View.dispatchAttachedToWindow(View.java:20753) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3490) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3497) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3497) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3497) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3497) at android.view.AttachInfo_Accessor.setAttachInfo(AttachInfo_Accessor.java:57) at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:368) at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:436) at com.android.tools.idea.layoutlib.LayoutLibrary.createSession(LayoutLibrary.java:121) at com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:736) at com.android.tools.idea.rendering.RenderTask.lambda$inflate$7(RenderTask.java:892) at 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) at java.base/java.lang.Thread.run(Thread.java:829)
class StarLightBoardView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : AbstractComposeView(
    context,
    attrs,
    defStyleAttr
) {

    var starLight by mutableStateOf(0)

    var onAddStarClick by mutableStateOf<() -> Unit>({})

    override var shouldCreateCompositionOnAttachedToWindow: Boolean = false
        private set

    init {
        shouldCreateCompositionOnAttachedToWindow = true
    }

    @Composable
    override fun Content() {
        StarLightBoardView(
            modifier = Modifier.size(R.dimen.dp_113, R.dimen.dp_30),
            starLight = if (isInEditMode) 10 else starLight,
            typeface = when {
                isInEditMode -> Typeface.DEFAULT_BOLD
                else -> AppGlobalConfig.getNumberFontTypeface(context)
            },
            onAddStarClick = if (isInEditMode) fun() {} else onAddStarClick
        )
    }
}

感谢您的回答,您能帮助我解决这个问题吗?

1个回答

0

我曾经遇到过同样的问题。唯一有效的解决方法是放弃继承自AbstractComposeView的类,改用无法继承的ComposeView。这意味着你需要将逻辑从StarLightBoardView类中移出,并移到包含它的任何类中,然后在ComposeView对象上调用setContent方法。

<LinearLayout
  ...

  <!-- Use ComposeView here rather than your Custom `StarLightBoardView` -->
  <androidx.compose.ui.platform.ComposeView
    android:id="@+id/myComposeView"
    ... />

/LinearLayout>

并将您的这个逻辑移动:

var starLight by mutableStateOf(0)

var onAddStarClick by mutableStateOf<() -> Unit>({})

放入包含类中


使用这种方法,您是否会获得显示ComposeView相应内容的预览? - JCarlosR
@JCarlosR 是的,我做了。 - Diarrhio
谢谢。为此,我们需要声明 tools:composableName - JCarlosR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接