Home > Blockchain >  Expected methods do not exists MutableStateFlow<List<T>>() for manipulation
Expected methods do not exists MutableStateFlow<List<T>>() for manipulation

Time:10-07

I have this MutableStateFlow<>() declaration:

private val _books = MutableStateFlow<List<Book>>(emptyList())

I am trying to append/add results from the database:

fun fetchAllBooks(user_id: Long) = viewModelScope.launch(Dispatchers.IO) {
    dbRepository.getAllUsersBooks(user_id).collect{ books ->
        _books.add() // Does not exist, nor does the 'postValue' method exists
    }
}

But, this does not work as I though, non of the expected methods exists.

CodePudding user response:

If you need to update the state of a MutableStateFlow, you can set the value property:

fun fetchAllBooks(user_id: Long) = viewModelScope.launch(Dispatchers.IO) {
    dbRepository.getAllUsersBooks(user_id).collect{ books ->
        _books.value = books
    }
}

It will trigger events on collectors if the new value is different from the previous one.

But if getAllUsersBooks already returns a Flow<List<Book>>, you could also simply use it directly instead of updating a state flow.

If you really want a StateFlow, you can also use stateIn:

fun fetchAllBooks(user_id: Long) = dbRepository.getAllUsersBooks(user_id)
    .flowOn(Dispatchers.IO) // likely unnecessary if your DB has its own dispatcher anyway
    .stateIn(viewModelScope)

CodePudding user response:

You are actually declaring the immutable list and trying to add and remove data instade of that use mutable list to add or remove data from list like here :-

private var _bookState = MutableStateFlow<MutableList<Book>>(mutableListOf())
private var books=_bookState.asStateFlow()
var bookList= books.value

and to send the data to the state use this:-

viewModelScope.launch {
        _bookState.value.add(BookItem)     


 }
viewModelScope.launch {
            _bookState.value.remove(BookItem)    
}

I hope this will work out for you if you have any query pls tell me in comment.

  • Related