flamewave000
flamewave000

Reputation: 616

Create StateFlow from SharedFlow

I have an object where I wish to create hot StateFlow objects from a filtered cold SharedFlow. The intent is that the SharedFlow is an event channel of data changes, but all data can be retrieved to get the current state. This means for a given field, I can find the current state, and then monitor the SharedFlow to get state changes.

I would like to provide an API that (as an example) converts the SharedFlow into a StateFlow in a manner as follows:

var myVariable = DEFAULT_VALUE
val mySharedFlow = MutableSharedFlow<Int>()

val myStateFlow = mySharedFlow
                    .filter { it < 42 }
                    .asStateFlow(myVariable)// <- Convert to a StateFlow given a default value

This is obviously an overly simplified example, but my situation is more complex, and currently I have to invoke a function when ever a field changes, but currently I do the following:

myObj.onChange.collect(handler)
handler(myObj.getCurrentValue)

fun handler(data: Int) {
    // Handle data change
}

But I would prefer to use a Hot StateFlow and remove the need for the second function call. Especially since many consumers of this are small bits of code (mostly just a single expression) that do not need to be in their own function context, and should just be simple lambdas.

Upvotes: 4

Views: 2271

Answers (1)

flamewave000
flamewave000

Reputation: 616

Tenfour04 answered my question in his comment. The function I needed is called stateIn().

Upvotes: 3

Related Questions