我想使用StateFlow。但现在,我找不到任何能帮助我的讲座
我面临一个问题:首先,我有一个singleton,它包含一个String列表,我想要一些东西"容易";理解,即使这不是目前的目标。目的是用字符串填充和发出列表(稍后它将是一个复杂的对象(。
class CustomStateFlow() {
private val _custom = MutableStateFlow(emptyList<String>())
val custom: StateFlow<List<String>> = _custom
fun addString(string: String) {
val tempList = _custom.value.toMutableList()
tempList.add(string)
_custom.value = tempList
}
这似乎有效,但我不喜欢这份临时名单。。。如果没有,我就无法触发";收集";在我的片段中的习俗。
有没有一种方法可以在不使用tempList的情况下实现这一点?
谢谢
如果您不想使用临时变量将新项添加到可变列表中,可以使用加(+(运算符函数。这样做会返回一个新的列表(不可变的(,其中添加了可以进一步使用的值。
所以伪代码变成这样:val newList = oldMutableList + newItem
类似地,您可以从列表中删除项目,如val newList = oldMutableList - itemToRemove
在这里阅读更多关于kotlin集合的运算符函数!
我在三个阶段内完成这项工作;回购、视图模型和组合函数。
数据操作的存储库
//This object is the list you will edit
private val _easyChatList = mutableListOf<ChatDescriptionEntity>()
//This object is a wrapper. if you pass it a new object it will call emit
private val _easyChatListHolder = MutableStateFlow(listOf<ChatDescriptionEntity>())
//this object sends out the immutable list
override val easyChatList = _easyChatListHolder.asStateFlow()
//-- add() or remove or sort or shuffle etc --//
fun sortUpdatedChatLists()
{
_easyChatList.sort()
val nl = _easyChatList.toList() // extract a new list to force the emit
_easyChatListHolder.value = nl
}
您的片段或合成的视图模型,列表发送到的位置
var easyChatList: MutableState<List<ChatDescriptionEntity>> = mutableStateOf(listOf())
init {
repositoryInterface.getChatsList()
viewModelScope.launch {
repositoryInterface.easyChatList.collect{
i -> easyChatList.value = i
}
}
}
最后在你的作文方法。从视图模型中交给可变状态的任何组合都将对列表更改做出反应
val chatList = viewModel.easyChatList.value
ChatListContent(items = chatList, action = navToChat)