Skip to content

Simple demo to use jetpack compose with MVI architecture with clean way.

License

Notifications You must be signed in to change notification settings

bqliang/MVI-JetpackCompose-Github

 
 

Repository files navigation

GithubCompose (Kotlin + Jetpack Compose + Navigation + MVI)

Language

GithubCompose is an exemplary project showcasing a contemporary approach to Android app development. It skillfully merges popular Android tools and exemplifies best development practices by incorporating cutting-edge technologies such as Compose, Kotlin Flow, and Koin.

The sample app presents a modern Android application architecture, emphasizing scalability and maintainability through the implementation of MVI (Model-View-Intent).

Description

Light and Dark mode

Dark Theme UI Light Theme UI
dark-theme.mp4
light-theme.mp4

Architecture

The project's architecture follows a clear division of responsibilities between its View, Presentation, and Model components, thoughtfully implementing the Model-View-Intent (MVI) pattern in conjunction with the powerful features of Jetpack Compose.

Architecture layers:

  • View - Composable screens that consume state, apply effects and delegate events.
  • ViewModel - that manages and reduces the state of the corresponding screen. Additionally, it intercepts UI events and produces side-effects. The ViewModel lifecycle scope is tied to the corresponding screen composable.
  • Model - Repository classes that retrieve data. In a clean architecture context, one should use use-cases that tap into repositories.

There are a three core components described:

  • State - data class that holds the state content of the corresponding screen e.g. list of User, loading status etc. The state is exposed as a Compose runtime MutableState object from that perfectly matches the use-case of receiving continuous updates with initial value.

  • Event - plain object that is sent through callbacks from the UI to the presentation layer. Events should reflect UI events caused by the user. Event updates are exposed as a MutableSharedFlow type which is similar to StateFlow and that behaves as in the absence of a subscriber, any posted event will be immediately dropped.

  • Effect - plain object that signals one-time side-effect actions that should impact the UI e.g. triggering a navigation action, showing a Toast, SnackBar etc. Effects are exposed as ChannelFlow which behave as in each event is delivered to a single subscriber. An attempt to post an event without subscribers will suspend as soon as the channel buffer becomes full, waiting for a subscriber to appear.

Every screen/flow defines its own contract class that states all corresponding core components described above: state content, events and effects.

About

Simple demo to use jetpack compose with MVI architecture with clean way.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Kotlin 100.0%