Android Xml设计工具无法预览AbstractComposeView子类的Widget?

Hwa*_*ang 6 android android-jetpack-compose

这是我的代码,AbstractComposeView 的一个类。但在xml设计工具上无法显示。并且 xml 设计工具显示错误消息:

java.lang.IllegalStateException: ViewTreeLifecycleOwner 未从 androidx.constraintlayout.widget.ConstraintLayout{3deb8822 VE..... ......ID 0,0-0,0} 在 androidx.compose.ui.platform.WindowRecomposer_androidKt 中找到.createLifecycleAwareViewTreeRecomposer(WindowRecomposer.android.kt:244) 在 androidx.compose.ui.platform.WindowRecomposer_androidKt.access$createLifecycleAwareViewTreeRecomposer(WindowRecomposer.android.kt:1) 在 androidx.compose.ui.platform.WindowRecomposerFactory$Companion$LifecycleAware$1。 createRecomposer(WindowRecomposer.android.kt:99) 在 androidx.compose.ui.platform.WindowRecomposerPolicy.createAndInstallWindowRecomposer$ui_release(WindowRecomposer.android.kt:155) 在 androidx.compose.ui.platform.WindowRecomposer_androidKt.getWindowRecomposer(WindowRecomposer.android. kt:230)在androidx.compose.ui.platform.AbstractComposeView.resolveParentCompositionContext(ComposeView.android.kt:244)在androidx.compose.ui.platform.AbstractComposeView.ensureCompositionCreated(ComposeView.android.kt:251)在androidx.compose .ui.platform.AbstractComposeView.onAttachedToWindow(ComposeView.android.kt:283) 在 android.view.View.dispatchAttachedToWindow(View.java:20753) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3490) 在 android. view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3497) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3497) 在 android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3497) 在 android.view.ViewGroup.dispatchAttachedToWindow (ViewGroup.java:3497) 在 android.view.AttachInfo_Accessor.setAttachInfo(AttachInfo_Accessor.java:57) 在 com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:368) 在 com.android.layoutlib。 bridge.Bridge.createSession(Bridge.java:436) 在 com.android.tools.idea.layoutlib.LayoutLibrary.createSession(LayoutLibrary.java:121) 在 com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask. java:736) 在 com.android.tools.idea.rendering.RenderTask.lambda$inflate$7(RenderTask.java:892) 在 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: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
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Dia*_*hio 0

我也遇到了同样的问题。我发现唯一有效的修复方法是摆脱继承自的类AbstractComposeView,而使用ComposeView无法继承的类。这意味着您必须将逻辑从StarLightBoardView类中移出并移至包含它的任何类中,然后调用setContentComposeView对象。

<LinearLayout
  ...

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

/LinearLayout>
Run Code Online (Sandbox Code Playgroud)

并移动你的这个逻辑:

var starLight by mutableStateOf(0)

var onAddStarClick by mutableStateOf<() -> Unit>({})
Run Code Online (Sandbox Code Playgroud)

进入包含类