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)
感谢您的回答,您能帮我解决问题吗?
我也遇到了同样的问题。我发现唯一有效的修复方法是摆脱继承自的类AbstractComposeView
,而使用ComposeView
无法继承的类。这意味着您必须将逻辑从StarLightBoardView
类中移出并移至包含它的任何类中,然后调用setContent
该ComposeView
对象。
<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)
进入包含类