【问题标题】:Manually recompose all AndroidView in JetPack Compose在 JetPack Compose 中手动重构所有 AndroidView
【发布时间】:2021-06-10 15:33:26
【问题描述】:

在我的项目中,我使用 JetPack Compose 和 AndroidView 来使用 XML 视图。

@Composable
fun MyComposable(
    message: String
) {

    AndroidView(
        factory = { context ->

            TextView(context).apply {
                text = message
            }

        })
}

我的问题是,当我的message 状态发生变化时,AndroidView 中的 XML 视图不会重新组合。 AndroidView 中有一个选项可以阻止状态变化?

ps:我已经为示例简化了MyComposable

【问题讨论】:

    标签: android view android-jetpack android-jetpack-compose


    【解决方案1】:

    您可以使用update 块。

    来自doc

    update 块由于重组可以多次运行(在 UI 线程上也是如此),它是根据状态设置 View 属性的正确位置。 当状态发生变化时,该块将被重新执行以设置新的属性。请注意,该块也将在 factory 块完成后立即运行一次

    AndroidView(
        factory = { context ->
    
            TextView(context).apply {
                text = "Initial Value"
            }
        },
        update = {
            it.text =  message
        }
    )
    

    【讨论】:

    • 谢谢你,它工作得很好!祝你有美好的一天!
    • 值得注意的是,update() 将更改在 factory() 内部构造的视图的属性。但它不会使用新属性重新执行整个工厂块。因此,如果视图很复杂并且需要一些修补,并且您无法弄清楚它为什么不更新,您可能需要在 update() 中重申一些 factory() 逻辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    相关资源
    最近更新 更多