简体   繁体   中英

Populate and emit StateFlow List

I want to use StateFlow. But for now, I don't find any lecture which could help me.

I'm facing an issue: To start, I have a singleton which hold a list of String, I want something "easy" to understand even if it isn't the goal purpose for now. The purpose is to populate and emit the list with strings (it will be a complex object later).

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
}

This seems to work, but I don't like the temp list... without, I can't trigger the "collect" of custom in my fragment.

Is there a way to achieve this without using a tempList?

Thanks you

If you don't want to take temporary variable in-order to add new item to mutable list you can use plus (+) operator function . By doing so returns you new list (immutable) with added value that you can use further.

So the pseudo-code becomes something like this: val newList = oldMutableList + newItem

Similarly you can remove item from list like val newList = oldMutableList - itemToRemove

Read more about operator function on kotlin collection here !

There are 3 stages Im doing this within; the repo, the view model and the compose function.

Repository where the data manipulated

    //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


}

viewmodel for your fragment or compose where the list is sent

  var easyChatList: MutableState<List<ChatDescriptionEntity>> = mutableStateOf(listOf())

init {

    repositoryInterface.getChatsList()

    viewModelScope.launch {

        repositoryInterface.easyChatList.collect{
                i -> easyChatList.value = i
        }
    }


}

Lastly in you compose method. any compose that is handed the mutablestate from your viewmodel will react to list changes

val chatList = viewModel.easyChatList.value


ChatListContent(items = chatList, action = navToChat)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM