Extendable MVI framework for Kotlin Multiplatform with powerful debugging tools (logging and time travel), inspired by Badoo MVICore library

Overview

Maven Central License kotlinlang|MVIKotlin

Should you have any questions or ideas please welcome to the Slack channel: #mvikotlin

Inspiration

This project is inspired by Badoo MVICore library.

Overview

What is MVI

MVI stands for Model-View-Intent. It is an architectural pattern that utilizes unidirectional data flow. The data circulates between Model and View only in one direction - from Model to View and from View to Model.

MVI

What is MVIKotlin

MVIKotlin is a Kotlin Multiplatform framework that provides a way of (not only) writing shared code using MVI pattern. It also includes powerful debug tools like logging and time travel. The main functionality of the framework does not depend on any reactive nor coroutines library. Extensions for Reaktive and for Coroutines libraries are provided as separate modules.

MVIKotlin

Responsibility

MVIKotlin does not bring or enforce any particular architecture. Its responsibility can be described as follows:

  • To provide a single source of truth for State (the scope is not defined, it can be a whole app, a screen, a feature, or a part of a feature);
  • To provide an abstraction for UI with efficient updates (however this is not obligatory, you can use whatever you want);
  • To provide lifecycle aware connections (binding) between inputs and outputs (again this is not obligatory in any way).

Everything else is out of scope of the library, there are no definitions for "screens", "features", "modules", etc. Also, no particular reactive framework is enforced/exposed. This gives a lot of flexibility:

  • MVIKotlin can be introduced incrementally (e.g. you can start using it in a small feature and then expand gradually);
  • You can use/experiment with different architectures, approaches and/or libraries for navigation, UI, modularization, etc;
  • Use whatever reactive framework you like or don't use it at all.

You can find one of the architecture options in the samples. Again, this is just an example of one possible solution.

Setup

Recommended minimum Gradle version is 5.3. Please read first the documentation about metadata publishing mode.

There are a number of modules published to Maven Central:

  • mvikotlin - core interfaces and functionality (multiplatform)
  • mvikotlin-main - the main module with the default Store implementation (mutiplatform)
  • mvikotlin-logging - logging functionality (mutiplatform)
  • mvikotlin-timetravel - time travel feature (mutiplatform)
  • mvikotlin-extensions-reaktive - extensions set for Reaktive library (multiplatform)
  • mvikotlin-extensions-coroutines - extensions set for coroutines (multiplatform)
  • keepers - provides StateKeeper and InstanceKeeper API for state preservation and objects retaining
  • rx - a tiny module with abstractions over rx and coroutines (multiplatform)

Add required modules to your module`s build.gradle file:

implementation "com.arkivanov.mvikotlin:<module-name>:<version>"

Features

  • Multiplatform: Android, JVM, JavaScript, iosX64, iosArm64, macosX64, linuxX64
  • Does not depend on any reactive library or coroutines
  • Extensions for Reaktive library
  • Extensions for Coroutines
  • Multithreading friendly (freezable in Kotlin Native if needed)
  • Logging functionality with customizable logger and formatter
  • Time travel feature:
    • Multiplatform for all supported targets
    • Plug-and-play UI for Android
    • Plug-and-play UI for iOS (copy-paste from the sample app)
    • Export/import events for Android
    • IDEA and Android Studio plugin for Android apps
    • MacOS client application for iOS and macOS apps

Documentation

https://arkivanov.github.io/MVIKotlin

Sample project

The sample project is a todo list with details view.

  • Shared module using Reaktive is here
  • Shared module using coroutines is here
  • Sample Android application with both Reaktive and coroutines implementations, plus logging and time travel is here
  • Sample iOS application with Reaktive implementation only, plus logging and time travel is here
  • Sample JavaScript application with both Reaktive and coroutines implementations, plus logging and time travel is here

Author

Twitter: @arkann1985

If you like this project you can always Buy Me A Coffee ;-)

Watch video (time travel, logs, debug, etc.)

Debugging Android application with MVIKotlin

Debugging Android application with MVIKotlin

Debugging iOS application with MVIKotlin

Debugging iOS application with MVIKotlin

Debugging Android application with IntelliJ IDEA time travel plugin

Debugging Android application with IntelliJ IDEA time travel plugin

Debugging iOS application using MVIKotlin time travel client app

Debugging iOS application using MVIKotlin time travel client app

Issues
  • Logo wanted!

    Logo wanted!

    The project needs logo but I'm not good at design. I will appreciate any help here. Ideally it should highlight Kotlin and MVI (or unidirectional data flow). I'm quite flexible here.

    help wanted 
    opened by arkivanov 39
  • Add todo details screen for the iOS sample app

    Add todo details screen for the iOS sample app

    https://github.com/arkivanov/MVIKotlin/issues/18

    Still needs some refactoring and cleanup before merge.

    Please add any questions/comments/suggestions, very open to improvements :)

    opened by sgallese 23
  • Implement sample todo details screen for iOS

    Implement sample todo details screen for iOS

    Details screen is already there for Android but is missing for iOS. Would be good to add one, same way as it is done for todo list screen: the business logic is already there and is shared, only UI part is missing (Swift UI).

    Sample todo details screen for Android: https://github.com/arkivanov/MVIKotlin/tree/master/sample/todo-app-android/src/main/java/com/arkivanov/mvikotlin/sample/todo/android/details

    Sample todo list screen for iOS: https://github.com/arkivanov/MVIKotlin/blob/master/sample/todo-app-ios/todo-app-ios/SceneDelegate.swift Should be moved to a separate class (file) with proper navigation between the screens.

    enhancement help wanted 
    opened by arkivanov 22
  • Find another name for the project. Please suggest.

    Find another name for the project. Please suggest.

    I was told that the name "MVIKotlin" violates Kotlin Foundation guidelines. So we need to find another name for the project. Suggestions are welcome!

    help wanted 
    opened by arkivanov 15
  • MVI Kotlin (JS) is compatible/tested with which coroutines version?

    MVI Kotlin (JS) is compatible/tested with which coroutines version?

    I just did setup for my project for JS-Browser target and I am getting following issue: image

    image

    Issue seems like a coroutines bug to me.... So I tried with with 2 different version 1.4.3 and 1.4.2 , but no luck . So to just confirm , MVI Kotlin + Decompose has to be proven working with which coroutines version?

    for a reproducer , @arkivanov ,you are added as a collaborator in my project's private repo. image

    opened by Shabinder 15
  • Issue with Time travel debug

    Issue with Time travel debug

    When I try to connect to device, always receive the error: Error forwarding port via ADB. Make sure there is only one device connected. " reproduced on emulator and real device. adb devices shows only one device connected OS: Mac os catalina Plugin version: 2.0.0-rc1 Android studio version: 4.0.0, 4.1.0 beta 3

    bug 
    opened by heckslam 14
  • make Reducer a fun interface?

    make Reducer a fun interface?

    Maybe it's an idea to make Reducer a fun-interface?

    enhancement help wanted 
    opened by tieskedh 14
  • Job does not have time to cancel and calls render after a view is destroyed

    Job does not have time to cancel and calls render after a view is destroyed

    Hello! In my application, I store a navigation action in a state, and also use the NavController::addOnDestinationChangedListener to tell the Store that the navigation action has been completed and can be nullified. Thus, Store generates a new state at the very edge before destroying the view. Today I ran into the fact that 1 time out of 10, the state arrives in the render method too late, and the application crashes due to the fact that the view has already nullified. Changing BinderLifecycleMode from START_STOP to RESUME_PAUSE had no effect. I assumed that a coroutine does not have time to cancel Job and added yield() here, before assertOnMainThread(), and it seems to help. I was unable to reproduce the problem again. It will be great if you do it in the library :)

    bug 
    opened by Skeptick 11
  • Js(IR Compiler) variant support?

    Js(IR Compiler) variant support?

    Is there support for using this in project built with IR compiler instead of Legacy as legacy leads to huge .js files and IR is more optimised than legacy.

    enhancement 
    opened by Shabinder 10
  • Issue importing MviKotlin for JS browser target (Kotlin 1.3.72)

    Issue importing MviKotlin for JS browser target (Kotlin 1.3.72)

    Hi,

    I'm encountering an error executing the jsBrowserProductionWebpack task for a js browser target after importing MviKotlin dependencies on a multiplatform project (using Kotlin 1.3.72):

    74% optimizing 74% basic module optimization 75% module optimization 75% advanced module optimization 76% after module optimization 76% basic chunk optimization 76% basic chunk optimization EnsureChunkConditionsPlugin 76% basic chunk optimization RemoveParentModulesPlugin 76% basic chunk optimization RemoveEmptyChunksPlugin 76% basic chunk optimization MergeDuplicateChunksPlugin 77% chunk optimization 77% advanced chunk optimization 77% advanced chunk optimization SplitChunksPlugin 77% advanced chunk optimization RemoveEmptyChunksPlugin 77% after chunk optimization 78% module and chunk tree optimization 78% after module and chunk tree optimization 79% basic chunk modules optimization 80% chunk modules optimization 80% chunk modules optimization ModuleConcatenationPlugin 80% advanced chunk modules optimization 81% after chunk modules optimization 81% module reviving 81% module reviving RecordIdsPlugin 82% module order optimization 82% module order optimization OccurrenceOrderModuleIdsPlugin 82% advanced module order optimization 83% before module ids 83% module ids 84% module id optimization 84% module id optimization 85% chunk reviving 85% chunk reviving RecordIdsPlugin 85% chunk order optimization 85% chunk order optimization OccurrenceOrderChunkIdsPlugin 86% before chunk ids 86% chunk id optimization 86% chunk id optimization FlagIncludedChunksPlugin 87% after chunk id optimization 88% hashing 88% after hashing 89% module assets processing 90% chunk assets processing 90% additional chunk assets processing 92% additional asset processing 92% chunk asset optimization 92% chunk asset optimization TerserPlugin 93% after chunk asset optimization 93% after chunk asset optimization SourceMapDevToolPlugin 93% after chunk asset optimization SourceMapDevToolPlugin 93% after chunk asset optimization SourceMapDevToolPlugin content.js generate SourceMap 93% after chunk asset optimization SourceMapDevToolPlugin resolve sources 93% after chunk asset optimization SourceMapDevToolPlugin content.js attach SourceMap 93% after chunk asset optimization SourceMapDevToolPlugin 93% asset optimization 94% after asset optimization 94% after seal 100% Hash: 05868d80530f6fdfdf4a Version: webpack 4.41.2 Time: 4463ms Built at: 2020-08-21 21:27:27 2 assets Entrypoint main = content.js content.js.map [0] ./kotlin-dce/kotlin.js 242 KiB {0} [built] [2] ./kotlin-dce/Reaktive-utils.js 2.41 KiB {0} [built] [3] ./kotlin-dce/kotlinx-coroutines-core.js 270 KiB {0} [built] [4] multi ./kotlin-dce/untitled5-content.js 28 bytes {0} [built] [5] ./kotlin-dce/untitled5-content.js 2.82 KiB {0} [built] [6] ./kotlin-dce/MVIDroid-mvikotlin.js 3.16 KiB {0} [built] [7] ./kotlin-dce/MVIKotlin-mvikotlin-extensions-coroutines.js 3.18 KiB {0} [built] [8] ./kotlin-dce/MVIKotlin-rx.js 761 bytes {0} [built] [9] ./kotlin-dce/MVIKotlin-utils-internal.js 1.63 KiB {0} [built] + 1 hidden module

    ERROR in ./kotlin-dce/MVIDroid-mvikotlin.js Module not found: Error: Can't resolve 'MVIDroid-rx-internal' in 'C:\Users\denis\IdeaProjects\untitled5\build\js\packages\untitled5-content\kotlin-dce' @ ./kotlin-dce/MVIDroid-mvikotlin.js 3:4-111 @ ./kotlin-dce/untitled5-content.js @ multi ./kotlin-dce/untitled5-content.js

    ERROR in ./kotlin-dce/MVIDroid-mvikotlin.js Module not found: Error: Can't resolve 'MVIDroid-utils-internal' in 'C:\Users\denis\IdeaProjects\untitled5\build\js\packages\untitled5-content\kotlin-dce' @ ./kotlin-dce/MVIDroid-mvikotlin.js 3:4-111 @ ./kotlin-dce/untitled5-content.js @ multi ./kotlin-dce/untitled5-content.js

    ERROR in ./kotlin-dce/MVIKotlin-mvikotlin-extensions-coroutines.js Module not found: Error: Can't resolve 'MVIKotlin-mvikotlin' in 'C:\Users\denis\IdeaProjects\untitled5\build\js\packages\untitled5-content\kotlin-dce' @ ./kotlin-dce/MVIKotlin-mvikotlin-extensions-coroutines.js 3:4-136 @ ./kotlin-dce/untitled5-content.js @ multi ./kotlin-dce/untitled5-content.js

    • Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

    • Get more help at https://help.gradle.org

    BUILD FAILED in 27s 5 actionable tasks: 5 executed

    After investigating a bit the issue I've seen that the names on the js modules imported from bintray for MviKotlin do not match the ones generated upon building the project directly from the sources. The first screenshot shows the files imported from bintray, the second shows the ones generated when building from the MviKotlin source project

    idea64_v9CNxdbXX4

    7zFM_TChqXc4ixr

    There is also a discrepancy between definitions inside the js between the two files besides the file name

    imagen

    I've generated the related js module from the source project and imported locally for my project and the build problem seems to be resolved (building the js file using the latest code on master, 1d19db521380581f666380ee5df74ae6e811ec4e)

    idea64_v4L5SlBhv7

    Could these discrepancies be the problem when trying to use directly the bintray dependencies?

    opened by denislfernandez 9
  • Can't export time travel data

    Can't export time travel data

    It looks like the export option for time travel data is not working correctly. I was trying out the time travel feature using the TodoApp project and the export button does not open up a dialog on where to save the data. See recording: https://youtu.be/vVxzPba4078

    Dev Environment:

    • Mac OS X Catalina 10.15.7
    • Android Studio Arctic Fox 2020.3.1 Beta 5
    • MVIKotlin Time Travel Plugin v2.0.0
    • Decompose v0.2.6
    • MVIKotlin v2.0.4
    opened by falcon4ever 2
  • Memory leak using

    Memory leak using "LifecycleExt.kt"

    Hello Arkadiy, thank you very much for such a great library!

    It seems to me there is a memory leak in this file: https://github.com/arkivanov/MVIKotlin/blob/bad123550ff7e451708280efbc4394ffdc347107/mvikotlin/src/commonMain/kotlin/com/arkivanov/mvikotlin/core/lifecycle/LifecycleExt.kt#L49

    Probably for all these methods: Lifecycle.doOnResumePause, Lifecycle.doOnPause, Lifecycle.doOnStartStop, Lifecycle.doOnStop.

    As soon as an anonymous callback instance is created, there is no chance to remove this object until onDestroy event. And if someone uses these methods in onStart then on each call a new callback will be added to LifecycleRegistry.

    As a variant to fix that, I can suggest returning Disposable to let a client to remove/unsubscribe from LifecycleRegistry in this way:

    inline fun Lifecycle.doOnResumePause(crossinline onResume: () -> Unit, crossinline onPause: () -> Unit): Disposable {
        val callbacks = object : DefaultLifecycleCallbacks {
            override fun onResume() {
                onResume.invoke()
            }
    
            override fun onPause() {
                onPause.invoke()
            }
        }
        subscribe(callbacks)
        return CancellableDisposable { unsubscribe(callbacks) }
    }
    
    // Then from the client side we can call `disposable?.dispose()` to remove added callback.
    
    

    At the same time there is no such issue with Lifecycle.doOnDestroy and Lifecycle.doOnCreateDestroy (at least on Android platform) because Android LifecycleRegistry removes a callback automatically after onDestroy event.

    @arkivanov does it make sense?

    enhancement 
    opened by ultraon 6
  • Deploy JS sample app to hosting as working example

    Deploy JS sample app to hosting as working example

    It would be great to have a link in the project description (README) so that everyone can see a working example without having to build the project themselves. For example, the sample can be deployed on github-pages or heroku.

    opened by maxtox3 1
  • Allow Stores instantiation from non-main threads

    Allow Stores instantiation from non-main threads

    Jetpack Compose will have multi-threaded compositions at some point, and so it should be possible to instantiate Stores from non-main threads. The Bootstrapper is currently invoked from Store constructor, it should continue be executing on main thread. We probably need an ability to manually trigger the Bootstrapper.

    enhancement 
    opened by arkivanov 1
  • "Used by" list

    It would be good to have a list of companies/users/projects where MVIKotlin is used. I sugest to stick to the following format, but feel free to ommit/add/modify any details:

    Project name: [project name] Project type: production/pet/sample Company name: personal/[company name] Supported targets: android, jvm, js, iosX64, iosArm64, macosX64, linuxX64 Sources link (if open source): [link]

    opened by arkivanov 9
Releases(2.0.4)
  • 2.0.4(Jun 15, 2021)

    • Added watchos target support (#233)
    • Updated coroutines to 1.5.0 in mvikotlin-extensions-coroutines module (#234)
    • Updated Reaktive to 1.2.0 in mvikotlin-extensions-reaktive module (#238)
    • Fixed recursive events of different types are not working in TimeTravelStore (#232)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.3(May 5, 2021)

  • 2.0.2(Apr 15, 2021)

  • 2.0.1(Feb 13, 2021)

    • Added setMainThreadId(...) functions for jvm and linuxX64 targets (#168)
    • Updated Kotlin to 1.4.30, Reaktive to 1.1.20 and coroutines to 1.4.2 (#174, #182)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0(Oct 3, 2020)

    • Updated Kotlin to 1.4.10 (#162 by @bachlis)
    • Fixed "ReferenceError: observer$ObjectLiteral is not defined" crash (#146 by @maxtox3)
    • Changed order of Lifecycle.State enum entries (#153)
    • Introduced InstanceKeeper in the keepers module, old InstanceKeeper is deprecated (#156)
    • Introduced StateKeeper in the keepers module, old StateKeeper is deprecated (#157)
    • Introduced AndroidX Lifecycle extensions in the mvikotlin module, old Lifecycle extensions are deprecated (#158)
    • Removed dependency on com.badoo.reaktive:utils (#160)
    • Removed vars from LogginStoreFactory (#161)

    Release notes

    The mvikotlin-extensions-androidx module is now deprecated. New InstanceKeeper and StateKeeper API is available in the separate keepers module. AndroidX Lifecycle extensions are available directly in the mvikotlin module.

    MVIKotlin does not depend on com.badoo.reaktive:utils anymore. So its Bintray repository definition can be removed, unless Reaktive is used in the project.

    Source code(tar.gz)
    Source code(zip)
  • 2.0.0-rc3(Aug 21, 2020)

    • Update Kotlin to 1.4.0 (#138)
    • Make BaseMviView.dispatch(Event) method publicc (#126)
    • Check for cancellation in coroutines binder (#128)
    • Disable Main thread assert if the Main thread is unknown (#136)
    • Remove Lifecycle.Callbacks method bodies, introduce DefaultLifecycleCallbacks interface (#139)
    • Fix LifecycleRegistry callback order when shutting down (#143)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0-rc2(Jul 25, 2020)

    • Refactored logging functionality (#97)
    • Refactored StateKeeper API
    • Added InstanceKeeper API
    • Fixed file choosers not showing in IDEA time travel plugin (#102, #103, #105, #107)

    Breaking changes

    The StateKeeper API is refactored, here are some most important changes:

    • removed the StateKeeperContainer interface and all its implementations;
    • StateKeeper.state: T property is replaced with StateKeeper.getState(): T method;
    • StateKeeper.register(...) method is replaced with StateKeeper.setSupplier(...) method;
    • StateKeeperProvider.get(...): StateKeeper method got additional argument clazz: KClass;
    • removed StateKeeperProvider.retainInstance(...) and StateKeeperProvider.retainStore(...) extension methods.

    A new InstanceKeeper API is introduced for objects retention.

    Both StateKeeper and InstanceKeeper APIs are annotated as experimental.

    The androidx-lifecycle-interop module is renamed to mvikotlin-extensions-androidx and now contains all extensions for AndroidX. Its package is changed to com.arkivanov.mvikotlin.extensions.androidx.*.

    Please refer to the updated documentation for more information.

    Source code(tar.gz)
    Source code(zip)
  • 2.0.0-rc1(Jun 29, 2020)

    • Support macOS target (#87)
    • Added StateKeeperProvider.retainStore(...) extension functions (#68)
    • MacOS time travel client app for iOS and macOS debugging (#89)
    • Time travel export/import in IDEA plugin (#93)
    • Sample JS app (#58 by @maxtox3)
    • Time travel UI for sample JS app (#74 by @maxtox3)
    • Unit and integration tests for sample shared code (#70)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0-beta5(May 20, 2020)

    • Added @JsName annotations for some methods (#57, #59)
    • Added a check to make sure the StateKeeper.register method is called only once (#61)
    • Fixed recursive view updates leading to a crash in IDEA time travel plugin (#60)
    • Documentation update: added information about responsibility of MVIKotlin (#54, #55)
    • Documentation update: described StateKeeper (#56)
    • Documentation update: updated mappers in samples (#62)
    • Documentation update: added Store disposing in samples (#64)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0-beta4(May 12, 2020)

    • Added reified retainInstance method (#47)
    • StateKeeper stuff moved one level up from the utils package (#49)
    • Updated samples (added inputs and outputs, removed event bus, refactored mappers, etc.) (#50, #51, #52)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0-beta3(May 6, 2020)

    • Time travel plugin for IntelliJ IDEA and Android Studio (docs) (#34)
    • Added extension for StateKeeperProvider for instances retaining (sample) (#43)
    • Added sample "Todo Details" screen to sample iOS app (by @sgallese) (#33, #35, #42)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0-beta2(Apr 13, 2020)

    • Configurable event types for LoggingStoreFactory (#30)
    • Renamed AbstractMviView to BaseMviView, added open renderer property (#29)
    • Minor API improvements (#24, #25, #26, #27, #28)
    • Added documentation (https://arkivanov.github.io/MVIKotlin)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.0-beta1(Apr 7, 2020)

  • 2.0.0-preview4(Mar 20, 2020)

  • 2.0.0-preview3(Mar 19, 2020)

  • 2.0.0-preview2(Mar 13, 2020)

  • 2.0.0-preview1(Mar 12, 2020)

    • MVIDroid to MVIKotlin transition
    • Multiplatform: Android, JVM, JavaScript, iosX64, iosArm64, linuxX64
    • Does not depend on any reactive library or coroutines
    • Extensions for Reaktive library
    • Extensions for Coroutines
    • Multithreading friendly (freezable in Kotlin Native if needed)
    • Logging functionality with adjustable verboseness and ability to provide custom logger
    • Time travel feature:
      • Multiplatform for all supported targets
      • Plug-and-play UI for Android
      • Plug-and-play UI for iOS (copy-paste from the sample app)
      • Export/import events for JVM and Android
    Source code(tar.gz)
    Source code(zip)
  • 1.3.3(Jul 9, 2019)

  • 1.3.2(Jul 7, 2019)

  • 1.3.1(Jul 5, 2019)

  • 1.3.0(Jun 2, 2019)

    • Introduced Observable.subscribeMvi(...), Disposable.attachTo(Lifecycle) and some other utils
    • Deprecated MviComponent, MviAbstractComponent, MviBinder, MviViewBundle and some other things
    • Time travel events serialization and deserialization
    Source code(tar.gz)
    Source code(zip)
  • 1.2.1(Nov 7, 2018)

  • 1.2.0(Nov 6, 2018)

  • 1.1.7(Oct 28, 2018)

  • 1.0.9(Jul 30, 2018)

Owner
Arkadii Ivanov
Android developer. Passionate about Kotlin Multiplatform, MVI and reactive programming.
Arkadii Ivanov
Kotlin Multiplatform Router for Android and iOS

A powerful Kotlin Multiplatform Router for Android and iOS Support I am happy to help you with any problem on gitter Feel free to open any new issue!

Sebastian Sellmair 336 Jun 24, 2021
Model-View-ViewModel architecture components for mobile (android & ios) Kotlin Multiplatform development

Mobile Kotlin Model-View-ViewModel architecture components This is a Kotlin Multiplatform library that provides architecture components of Model-View-

IceRock Development 385 Jul 29, 2021
Redux implementation for Kotlin (supports multiplatform JVM, native, JS, WASM)

Redux-Kotlin ![badge][badge-ios] A redux standard for Kotlin that supports multiplatform projects. Full documentation at http://reduxkotlin.org. Misso

Redux-Kotlin 186 Jul 27, 2021
A Model-View-Presenter / Model-View-Intent library for modern Android apps

Mosby A Model-View-Presenter and Model-View-Intent library for Android apps. Dependency dependencies { compile 'com.hannesdorfmann.mosby3:mvi:3.1.1

Hannes Dorfmann 5.5k Jul 25, 2021
MVU for Kotlin Multiplatform

Oolong Oolong is an Elm inspired Model-View-Update (MVU) implementation for Kotlin multiplatform. As the name implies, three core concepts comprise th

Oolong 259 Jul 30, 2021
BaseDemo 是Android MVVM + Retrofit + OkHttp + Coroutine 协程 + 组件化架构的Android应用开发规范化架构

BaseDemo 是Android MVVM + Retrofit + OkHttp + Coroutine 协程 + 组件化架构的Android应用开发规范化架构,通过不断的升级迭代,目前主要分为两个版本,分别为分支 MVVM+Databinding 组件化版本,分支MVVM+Databinding+Single 单体版本。旨在帮助您快速构建属于自己的APP项目架构,做到快速响应上手,另外再长期的实践经验中汇总了大量的使用工具类,主要放在了项目 `lib_common` 组件中,以供大家参考使用。具体使用请开发者工具自己项目需求决定选择如何使用。

Huan Zhou 35 Jul 22, 2021
Unidirectional Data Flow in Kotlin - Port of https://github.com/ReSwift/ReSwift to Kotlin

ReKotlin Port of ReSwift to Kotlin, which corresponds to ReSwift/4.0.0 Introduction ReKotlin is a Redux-like implementation of the unidirectional data

null 475 Jul 29, 2021
Nucleus is an Android library, which utilizes the Model-View-Presenter pattern to properly connect background tasks with visual parts of an application.

Nucleus Deprecation notice Nucleus is not under develpment anymore. It turns out that Redux architecture scales way better than MVP/MVI/MVVM/MVxxx and

Konstantin Mikheev 2k Jul 16, 2021
A data-binding Presentation Model(MVVM) framework for the Android platform.

PLEASE NOTE, THIS PROJECT IS NO LONGER BEING MAINTAINED. As personal time contraints, I am currently unable to keep up. Please use official android da

RoboBinding open source 1.3k Jul 14, 2021
A full-featured framework that allows building android applications following the principles of Clean Architecture.

EasyMVP A powerful, and very simple MVP library with annotation processing and bytecode weaving. EasyMVP eliminates the boilerplate code for dealing w

null 1.3k Jul 21, 2021
Moxy is MVP library for Android

Moxy This Moxy repository is deprecated and no longer supported. Please migrate to the actual version of the Moxy framework at Moxy communuty repo. De

Arello Mobile 1.6k Jul 25, 2021
A sample project in Kotlin to demonstrate AndroidX, MVVM, Coroutines, Hilt, Room, Data Binding, View Binding, Retrofit, Moshi, Leak Canary and Repository pattern.

This repository contains a sample project in Kotlin to demonstrate AndroidX, MVVM, Coroutines, Hilt, Room, Data Binding, View Binding, Retrofit, Moshi, Leak Canary and Repository pattern

Areg Petrosyan 5 May 24, 2021
MVVM for Android

AndroidBinding MVVM for Android What's New Pre Compiled version available on root directory android-binding.gen.zip for activity/application template

Andy Tsui 353 Mar 2, 2021
MVVM RECIPE ANDROID APP Is an app where I show how to use MVVM, retrofit, dagger hilt, coroutine, liveData, Kotlin, navigation component, and so on...

MVVM RECIPE ANDROID APP Is an app where I show how to use MVVM, retrofit, dagger hilt, coroutine, liveData, kotlin, navigation component, and so on...

Isaias Cuvula 6 Jul 7, 2021