- 
                Notifications
    You must be signed in to change notification settings 
- Fork 24
Creating a Shared Flow with Shared‐In
        Devrath edited this page Jan 21, 2024 
        ·
        4 revisions
      
    Using the SharedIn operator, We can convert the cold flow into a hot flow!
- 
Eagerly-> Emission will start even if no subscribers are there
- 
Lazily--> Emission will start on for first subscribers
- 
WhileSubscribed-> Emission will start when there are subscribers and end when there are no subscribers
output
Collected value (A) => Emitting value => 0
Collected value (A) => Emitting value => 1
Collected value (A) => Emitting value => 2
Collected value (A) => Emitting value => 3
Collected value (A) => Emitting value => 4
Collected value (A) => Emitting value => 5
Collected value (A) => Emitting value => 6
Collected value (A) => Emitting value => 7
Collected value (A) => Emitting value => 8
app_time_stats: avg=347.29ms min=3.81ms max=16603.19ms count=50 //Here second subscriber joins
Collected value (B) => Emitting value => 0
Collected value (A) => Emitting value => 9
Collected value (B) => Emitting value => 1
Collected value (A) => Emitting value => 10
Collected value (B) => Emitting value => 2
Collected value (A) => Emitting value => 11
Collected value (B) => Emitting value => 3code
class StateAndSharedFlowsDemoVm @Inject constructor(
    @ApplicationContext private val context: Context,
) : ViewModel() {
    // Cold Flow
    private fun generateDemoFlow() = flow {
        repeat(1000){
            emit("Emitting value => $it")
            delay(2000)
        }
    }.shareIn(
        scope = viewModelScope,
        started = SharingStarted.WhileSubscribed(),
        replay = 5
    )
    fun demo()  = viewModelScope.launch{
        // Give a delay of 1 second before subscribing
        delay(1000)
        generateDemoFlow().collect{
            println("Collected value (A) => $it")
        }
    }
    fun addNewSubscriber() = viewModelScope.launch{
        generateDemoFlow().collect{
            println("Collected value (B) => $it")
        }
    }
}