如何观察存储在另一个类中的列表发生更改以更新我的 Compose UI?

问题描述 投票:0回答:1

我是 Compose 和 Android 新手,所以我可能会在这里使用一些不正确的术语,但我基本上是在尝试观察列表何时更改并相应地更新我的 UI。该列表是不可变的,所以我只想观察引用何时更改为新列表。

class MyDataHolder {
    val myData = mutableStateOf(emptyList<MyData>())
}

myData
是我希望观察的列表,并且正在使用空列表进行初始化。

在我的可组合项中,我创建了

MyDataHolder
的实例并(尝试)观察其
myData
属性的更改。

@Composable
fun MainScreen() {
    val dataHolder = MyDataHolder()
    val myData by remember { dataHolder.myData }

    Box(Modifier.fillMaxSize()) {
        MyOtherScreen(dataHolder)
        Box {
            myData.forEach{
                Box(modifier = Modifier.size(60.dp, 60.dp)) {
                    
                }
            }
        }
    }
}

dataHolder
传递给
MyOtherScreen
dataHolder
传递给
ImageAnalysis.Analyzer
的子类,后者不断更新
myData
列表。

我看到的问题是,即使

myData
中的
dataHolder
列表更新为非空列表,UI 也永远不会包含应为
Box 中的每个项目显示的任何 
myData
 项目
列表(我已在布局检查器中验证了这一点)。

我在这里做错了什么?

android android-jetpack-compose android-jetpack
1个回答
0
投票

您想在撰写功能中使用 Flow 进行观察

类似的东西

class MyDataHolder {
    private val myData = mutableStateOf(emptyList<MyData>())
    private val _mutableMyDataStateFlow: MutableStateFlow<List<MyData>> = MutableStateFlow(mutableListOf())
    val myDataStateFlow: StateFlow<List<MyData>> = _mutableMyDataStateFlow.asStateFlow()

    fun updateData(newData: List<MyData>){
        myData = newData
        _mutableMyDataStateFlow.emit(myData)
    }
    
}

然后在您的可组合项中监听更改

@Composable
fun MyComposableList(myDataHolder: MyDataHolder){
    val myData = myDataHolder.myDataStateFlow.collectAsStateWithLifecycle()
    
    //Update your list with myData
}

每当您发出新数据时,您的撰写函数都会更新,并且 myData 将拥有新数据,因此只需使用 myData 更新您的列表即可

© www.soinside.com 2019 - 2024. All rights reserved.