簡體   English   中英

Jetpack Compose - 綁定到對象數組不會更新 UI

[英]Jetpack Compose - bind to an array of objects does not update UI

我正在從事一個用聊天信使編寫應用程序的項目。 我正在使用 Firestore 來存儲消息。 在應用程序中加載消息后,我附加了snapshotListener ,它使我的應用程序能夠在創建新消息或更改另一條消息時自動得到通知。

對於給定消息的本地表示,我使用DataHandler singletonArrayList存儲每條消息。 因此,當觸發snapshotListener時, DataHandler將新消息添加到它的列表中。

現在我希望 UI 為給定 ArrayList 中的每條消息顯示一個文本,並隨着每次更改進行更新:

var messages by remember { mutableStateOf(dataHandler.messageList) }

Column {
    messages.forEach { msg ->
        Text(text = msg.text)
    }
}

但是當我通過 firestore 控制台添加新消息時,我可以看到新消息已添加到DataHandler但未顯示在屏幕上。

有沒有辦法綁定到ArrayList實例而不需要通過活動和片段傳遞更新功能?

使用remember的這種構造,您的messages值只有在您自己啟動時才會更新,如下所示:

messages = listOf()

如果你不需要自己修改messages列表(根據你的描述,你真的不需要)並且只想跟蹤實際messages ,那么你可以使用這樣的東西:

val messages by dataHandler.messageList.collectAsState()

並且您的dataHandler必須是MutableStateFlow

問題解決了!! @pushpull 提到SnapshotStateList<ChatMessage>作為dataHandlermessageList的類型,並使用mutableStateListOf<ChatMessage>()對其進行初始化

此外,可組合的 function 使用 singleton 更簡單:

Column {
    dataHandler.messageList.forEach { msg ->
        Text(text = msg.text)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM