Skip to content

Kotlin-Android-Open-Source/kotlin-channel-event-bus

This branch is 126 commits behind Kotlin-Multiplatform-Foundation/kotlin-channel-event-bus:master.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

4776153 · Nov 25, 2023

History

61 Commits
Nov 20, 2023
Nov 25, 2023
Nov 25, 2023
Nov 24, 2023
Nov 19, 2023
Nov 25, 2023
Nov 19, 2023
Nov 25, 2023
Nov 19, 2023
Nov 19, 2023
Nov 25, 2023
Nov 25, 2023
Nov 19, 2023
Nov 19, 2023
Nov 19, 2023
Nov 19, 2023
Nov 19, 2023
Nov 19, 2023
Nov 19, 2023
Nov 20, 2023
Nov 19, 2023
Nov 23, 2023

Repository files navigation

kotlin-channel-event-bus 🔆

Build and publish snapshot

Kotlin version KotlinX Coroutines version

Hits

badge badge badge badge badge badge badge

TODO - TBD - WIP

Multi-keys, multi-producers, single-consumer event bus backed by kotlinx.coroutines.channels.Channels.

  • A Kotlin Multiplatform library that provides a simple event bus implementation using kotlinx.coroutines.channels.Channels. This is useful for UI applications where you want to send events to communicate between different parts / scope of your application.

  • This bus is thread-safe to be used by multiple threads. It is safe to send events from multiple threads without any synchronization.

  • ChannelEvent.Key will be used to identify a bus for a specific type of events. Each bus has a Channel to send events to and a Flow to receive events from.

  • The Channel is unbounded (Channel.UNLIMITED - default) or conflated Channel.CONFLATED. The Flow is cold and only one collector is allowed at a time. This make sure all events are consumed.

Liked some of my work? Buy me a coffee (or more likely a beer)

Buy Me A Coffee

Basic usage

// Create your event type
data class AwesomeEvent(val payload: Int) : ChannelEvent<AwesomeEvent> {
  override val key get() = Key

  companion object Key : ChannelEventKey<AwesomeEvent>(AwesomeEvent::class)
}

// Create your bus instance
val bus = ChannelEventBus()

// Send events to the bus
bus.send(AwesomeEvent(1))
bus.send(AwesomeEvent(2))
bus.send(AwesomeEvent(3))

// Receive events from the bus
bus
  .receiveAsFlow(AwesomeEvent) // or bus.receiveAsFlow(AwesomeEvent.Key) if you want to be explicit
  .collect { e: AwesomeEvent -> println(e) }

Supported targets

  • jvm / android.
  • js (IR).
  • Darwin targets:
    • iosArm64, iosArm32, iosX64, iosSimulatorArm64.
    • watchosArm32, watchosArm64, watchosX64, watchosX86, watchosSimulatorArm64.
    • tvosX64, tvosSimulatorArm64, tvosArm64.
    • macosX64, macosArm64.

Docs

TODO - TBD - WIP

Sample

  • Android Compose sample: an Android app using Compose UI to show how to use the library. It has two nested navigation graphs: RegisterScreen and HomeScreen.

    In RegisterScreen, we have 3 steps (3 screens) to allow user to input their information, step by step.

    • A RegisterSharedViewModel (bound to RegisterScreen navigation graph scope) is used to hold the whole state of the registration process. It observes events from the ChannelEventBus and update the state accordingly.

    • Each step screen has a ViewModel to hold the state of the screen, and will send events to the ChannelEventBus, then the RegisterSharedViewModel will receive those events and update the state.

Roadmap

TODO - TBD - WIP

License

TODO - TBD - WIP

About

Multi-keys, multi-producers, single-consumer event bus backed by kotlinx.coroutines.channels.Channels

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Kotlin 99.1%
  • Shell 0.9%