如何通过覆盖方法或函数外部更新 Jetpack compose UI

How to update Jetpack compose UI by override method or outside the function

我正在根据要求转换我的旧 XML UI。 在那里, 我无法通过 Jetpack compose UI 通过我的覆盖功能进行更新。 在一些研究中,我看到许多网站显示记忆功能有助于状态更新, 但, 至于我的情况。 我需要通过我在另一个 class.

中实现的覆盖功能来更新我的 UI
    private lateinit var materialList: List<Material>


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (savedInstanceState == null)
            viewModel.initFilters(initText, initFilters)
        materialpresenter.attachView(this, lifecycle)

        materialList= listOf()
        setContent {
            FilterBox(materialList)
        }

    }


@Composable
fun FilterBox(materialList: List<Material>) {
    var selectedIndex by remember { mutableStateOf("0") }
    val onItemClick = { index: Int -> selectedIndex = "0" }

    FlowRow(
        modifier = Modifier.padding(top = 14.dp),
        mainAxisAlignment = MainAxisAlignment.Start,
        crossAxisSpacing = 8.dp,
        mainAxisSpacing = 4.dp
    ) {
        materialList.forEach { hashTag ->
            if (selectedIndex == hashTag.id) {
                FilterSelectionItemText(
                    hashTag.slug, index = 0,
                    onClick = onItemClick
                )
            } else {
                FilterUnSelectionItemText(
                    hashTag.slug, index = 0,
                    onClick = onItemClick
                )
            }

        }
    }
}

    override fun onMaterials(list: List<Material>) {
        print("list :-" + list)
        materialList = list
    }

我想通过我的 onMaterials 函数更新我的 FilterBox 可组合 UI。 因为当我打印它时,它的打印数据正确,但我的 UI 没有更新。

要更新可组合项 UI,您首先需要保存数据的状态 因为可组合函数在有一些 state/data 更改时更新

在此示例中,您的数据是 materialList: List<Material>

您需要使用状态/可变状态/可变状态列表(用于列表)包装您的数据

将您的列表更改为 stateList 或 mutableState...

private val materialList: MutableState<List<Material>> = mutableStateOf(emptyList())

setContent 可组合状态中的状态收集数据,例如:

val myList: List<Material> by materialList // here you will get updated last data as List<Material>

FilterBox(myList)

从覆盖的方法更新状态。

  override fun onMaterials(list: List<Material>){
        materialList.value = list // your updated List
    }