我是 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
项目列表(我已在布局检查器中验证了这一点)。
我在这里做错了什么?
您想在撰写功能中使用 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 更新您的列表即可