Odyssey it's a declarative multiplatform navigation library for Multiplatform Compose

Overview

Odyssey

Odyssey it's a declarative multiplatform navigation library for Multiplatform Compose

🚧 WARNING! It's an early preview, so you use it with your own responsibility

How to start

First add dependency to gradle

named("commonMain") {
    dependencies {
        implementation("...") // For core classes
        implementation("...") // For compose extensions
    }
}

Main idea

Setup

The main class in library is RootController It provides navigation control and host backstack inside.

For setup navigation graph in common code you need to use

@Composable
fun RootContainer(
    rootController: RootController
) {
    RootHost(startScreen = NavigationTree.Root.Start, rootController = rootController) {
        destination(screen = NavigationTree.Root.Start) {
            // Here is the place to draw something in Compose
            // ...
            // Or you can provide composable function like below
            SomeScreen(rootController) 
        }
    }
}

Parameters

Params included inside destination by design

destination(screen = NavigationTree.Root.Start) {
    val key = params as? String
    SomeScreen(rootController, params)
}

Navigation

You must pass RootController to screen for inner navigation and if you need to open next screen just use this

 rootController.launch(NavigationTree.Root.Container)

or this if you want to pass params

 rootController.launch(NavigationTree.Root.Container, params = "Your any object")

Back

If you need to go back just use. Library supports multibackstack navigation for any of platform

 rootController.popBackStack()

Screens

You can create screen as you want, but you need to inherit your class from NavigationScreen interface In example I use NavigationTree class for it

 object NavigationTree {
    enum class Root : NavigationScreen {
        Start, Container
    }

    enum class Container : NavigationScreen {
        Chain
    }

    enum class Tabs : NavigationScreen {
        Main, Favorite, Settings
    }
}

Android Setup

For Android we must support hardware back pressing, so you need to do this in your Single Activity

  val rootController = RootController()
  rootController.setupWithActivity(this)

Example

Inside this project you can find example and of course if you have an issue or a question feel free to open new issue in Issues section

License

MIT License

Copyright (c) 2021 Aleksey Gladkov (@AlexGladkov)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Comments
  • backToScreen method is rolling down application instead of go to some screen

    backToScreen method is rolling down application instead of go to some screen

    So, i tried to use backToScreen(key) method to go back for needed screen, but instead of it application just rolls down.

    https://github.com/VitalyPeryatin/1Coin/tree/feature/FT-68_implement_account_edit_screen

    https://user-images.githubusercontent.com/100136541/201480753-628a2b5a-ea16-4788-86e8-a72c8d72d949.mp4

    1.3 
    opened by Bittner322 2
  • Missing ViewActions

    Missing ViewActions

    No opportunity to change extraBufferCapacity param for _viewActions SharedFlow, so when ViewModel send several actions in sequence, only the last action will be executed. I think there is needs more flexibility.

    For example:

    FeatureViewModel {
        fun someMethod() {
            ...
            viewAction = FeatureAction.Vibrate()
            viewAction = FeatureAction.Close()
            ...
        }
    }
    

    There is FeatureAction.Vibrate will be missed

    opened by VitalyPeryatin 1
  • Crash after clicking

    Crash after clicking "Back"

    If you are on the start screen and click on the "Back" button, then the application crashes. Exception stack trace:

    E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.finance_tracker.finance_tracker, PID: 25018
        java.util.NoSuchElementException: List is empty.
            at kotlin.collections.CollectionsKt__MutableCollectionsKt.removeLast(MutableCollections.kt:255)
            at ru.alexgladkov.odyssey.compose.RootController.removeTopScreen(RootController.kt:372)
            at ru.alexgladkov.odyssey.compose.RootController.popBackStack(RootController.kt:199)
            at ru.alexgladkov.odyssey.compose.controllers.MultiStackRootController.popBackStack(MultiStackRootController.kt:44)
            at ru.alexgladkov.odyssey.compose.RootController.popBackStack(RootController.kt:198)
            at ru.alexgladkov.odyssey.compose.RootController$setupBackPressedDispatcher$1.onBackPressed(RootController.kt:126)
            at ru.alexgladkov.odyssey.core.backpress.OnBackPressedDispatcher.onBackPressed(OnBackPressedDispatcher.kt:7)
            at ru.alexgladkov.odyssey.compose.extensions.RootController___LifeCycleKt$setupWithActivity$1.handleOnBackPressed(RootController + LifeCycle.kt:19)
            at androidx.activity.OnBackPressedDispatcher.onBackPressed(OnBackPressedDispatcher.java:192)
            at androidx.activity.ComponentActivity.onBackPressed(ComponentActivity.java:657)
            at android.app.Activity.onKeyUp(Activity.java:3707)
            at android.view.KeyEvent.dispatch(KeyEvent.java:2849)
            at android.app.Activity.dispatchKeyEvent(Activity.java:4024)
            at androidx.core.app.ComponentActivity.superDispatchKeyEvent(ComponentActivity.java:124)
            at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:86)
            at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.java:142)
            at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:389)
            at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:5545)
            at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5413)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4918)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4971)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4937)
            at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5077)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4945)
            at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5134)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4918)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4971)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4937)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4945)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4918)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4971)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4937)
            at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5110)
            at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:5273)
            at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:3071)
            at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2614)
            at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2605)
            at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:3048)
            at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:143)
            at android.os.MessageQueue.nativePollOnce(Native Method)
            at android.os.MessageQueue.next(MessageQueue.java:336)
            at android.os.Looper.loop(Looper.java:181)
            at android.app.ActivityThread.main(ActivityThread.java:7562)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
    
    1.3 
    opened by VitalyPeryatin 1
  • Added callback for getting breadcrumbs from navigation

    Added callback for getting breadcrumbs from navigation

    I'm working on adding tracing and performance analytics to the app. Right now Odyssey provides one way to monitor transactions. RootController.currentScreen outputs updates related to shown and removed screens. Unfortunately, this flow doesn't emit stream of events which correspond to screen changes one-to-one.

    This PR adds new callback which can be used by the app to monitor screen changes. It filters some event sources and helps with nested navigation (e.g. bottom navigation tabs switching emits both tab name and owner screen name).

    Unfortunately, this doesn't cover multiple layers of nesting (like bottom navigation where the screen also has tabs). Also, I'm not 100% sure on the format of the data.

    Could you please check the general direction of this change? Are there any caveats I should know, or maybe you have some different takes on solving this?

    opened by r4zzz4k 1
  • `parentRootController` for `MultiStackRootController` is always `null`

    `parentRootController` for `MultiStackRootController` is always `null`

    I haven't access to my parent RootController's NavigationGraph, because MultiStackRootController.findRootController() doesn't return correct parentRootController.


    Example for bug reproducing (branch: odyssey_navigation_issue): https://github.com/VitalyPeryatin/FinanceTracker/tree/odyssey_navigation_issue This row crashes application: rootController.findRootController().push(MainNavigationTree.AddTransaction.name)

    Improvement 1.0.1 
    opened by VitalyPeryatin 1
  • Bottom navigation elevation

    Bottom navigation elevation

    There is no way to configure elevation of Bottom Navigation since Odyssey library code passes no value in BottomBarNavigotor.kt line 60. (v 1.0.0) BottomNavigation( backgroundColor = bottomNavConfiguration.backgroundColor ) Thus androidx's composable BottomNavigation takes default value from BottomNavigationDefaults.Elevation = 8.dp

    Please add possibility to change bottom navigation elevation.

    Android Integration 1.0.1 
    opened by MegaAndroidDeveloper666 1
  • Theming in Odyssey

    Theming in Odyssey

    It is not available to pass own app theme by setupNavigation() function. Way to achieve that: get code from setupNavigation and wrap ModalNavigator with own theme:

            val navigationGraph: RootComposeBuilder.() -> Unit = {
                screen("screen1") {
                    Screen1()
                }
                screen(name = "screen2") {
                    Screen2()
                }
            }
    
            val rootController = RootComposeBuilder().apply(navigationGraph).build()
            rootController.setupWithActivity(this)
    
            setContent {
                CompositionLocalProvider(
                    LocalRootController provides rootController
                ) {
                    AppTheme() {
                        ModalNavigator {
                            Navigator("main")
                        }
                    }
                }
            }
    

    Would be awesome to have a tool to pass own app theme

    opened by MegaAndroidDeveloper666 1
  • Desktop version crash

    Desktop version crash

    example project: https://github.com/slartus/Moca/tree/sample/odyssey-desktop-bug

    java.lang.NoSuchFieldError: end at org.jetbrains.skia.impl.Library._nAfterLoad(Native Method) at org.jetbrains.skia.impl.Library$Companion._nAfterLoad(Library.jvm.kt) at org.jetbrains.skiko.Library.load(Library.kt:66) at org.jetbrains.skiko.SkiaLayer.(SkiaLayer.jvm.kt:29) at androidx.compose.ui.awt.ComposeLayer.(ComposeLayer.desktop.kt:73) at androidx.compose.ui.awt.ComposePanel.addNotify(ComposePanel.desktop.kt:111) at java.desktop/java.awt.Container.addNotify(Container.java:2800) at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4791) at java.desktop/java.awt.Container.addNotify(Container.java:2800) at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4791) at java.desktop/java.awt.Container.addNotify(Container.java:2800) at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4791) at java.desktop/javax.swing.JRootPane.addNotify(JRootPane.java:733) at java.desktop/java.awt.Container.addNotify(Container.java:2800) at java.desktop/java.awt.Window.addNotify(Window.java:787) at java.desktop/java.awt.Frame.addNotify(Frame.java:490) at java.desktop/java.awt.Window.show(Window.java:1049) at java.desktop/java.awt.Component.show(Component.java:1732) at java.desktop/java.awt.Component.setVisible(Component.java:1679) at java.desktop/java.awt.Window.setVisible(Window.java:1032) at SetupKt.setupNavigation(setup.kt:34)

    opened by slartus 1
  • popbackStack with key

    popbackStack with key

    в некоторых случаях происходит дабл-клики при тапе на кнопку "закрыть" в модалке. В таких случаях modalController.popBackStack отработает некорректно и закроет лишнее окно или упадёт. popBackStack с ключом решает данную проблему

    • пофиксил popBackStack, когда ничего нет в стеке для закрытия приводило к ошибке
    opened by slartus 0
  • Android - handling configuration changes

    Android - handling configuration changes

    After configuration changes such as screen rotation and theme change, navigation starts from the beginning. It is necessary to correct and process the configuration change.

    opened by e30n3 0
  • onScreenRemove не вызывается (backToScreen)

    onScreenRemove не вызывается (backToScreen)

    Момент ухода экрана с навигации можно отслеживать через onScreenRemove.

    Но вызов происходит через LaunchedEffect внутри AnimatedHost, а это работает через рекомпозицию. Цепочка прямых возвратов, как это делает backToScreen - вызовет onScreenRemove только у последнего целевого экрана, промежуточные останутся без внимания.

    onScreenRemove функция очень важная, хотелось бы гарантированной работы для каждого экрана.

    1.4 
    opened by puritanin 3
  • Проблем с отображением экрана на устройствах xiaomi

    Проблем с отображением экрана на устройствах xiaomi

    Не отрабатывает startDestination на определенных моделях xiaomi в следствие не отображается экран Если создать активити с которой будет переход на экран с compose то все начинает работать и экран становится видимым

    1.4 
    opened by FireWookie 1
Releases(release-1.3.0)
  • release-1.3.0(Dec 29, 2022)

    What's Changed

    • Hilt support (Experimental)
    • New flags
    • New start config
    • Bug fixes

    Full Changelog: https://github.com/AlexGladkov/Odyssey/compare/release-1.2.0...release-1.3.0

    Source code(tar.gz)
    Source code(zip)
  • release-1.2.0(Nov 29, 2022)

    What's Changed

    • Switch Tabs
    • Dialog full screen

    Full Changelog: https://github.com/AlexGladkov/Odyssey/compare/release-1.0.1...release-1.2.0

    Source code(tar.gz)
    Source code(zip)
  • release-1.0.1(Oct 24, 2022)

  • release-1.0.0(Oct 14, 2022)

  • release-1.0.0-beta14(Jul 28, 2022)

    What's Changed

    • Bugfix/fix modal screen height by @slartus in https://github.com/AlexGladkov/Odyssey/pull/46
    • custom navigation params by @slartus in https://github.com/AlexGladkov/Odyssey/pull/48
    • fix: alertdialog - double click on backdrop causes an error by @slartus in https://github.com/AlexGladkov/Odyssey/pull/50

    Full Changelog: https://github.com/AlexGladkov/Odyssey/compare/release-1.0.0-beta11...release-1.0.0-beta14

    Source code(tar.gz)
    Source code(zip)
  • release-1.0.0-beta11(Jun 14, 2022)

    What's Changed

    • fix: dialog close by screamer double click error by @slartus in https://github.com/AlexGladkov/Odyssey/pull/41
    • Bugfix/double backpressed error by @slartus in https://github.com/AlexGladkov/Odyssey/pull/43

    Full Changelog: https://github.com/AlexGladkov/Odyssey/compare/release-1.0.0-beta07...release-1.0.0-beta11

    Source code(tar.gz)
    Source code(zip)
  • release-1.0.0-beta07(Apr 29, 2022)

    What's Changed

    • fix: bottom dialog close by swipe error by @slartus in https://github.com/AlexGladkov/Odyssey/pull/40

    Full Changelog: https://github.com/AlexGladkov/Odyssey/compare/release-1.0.0-beta05...release-1.0.0-beta07

    Source code(tar.gz)
    Source code(zip)
  • release-1.0.0-beta05(Apr 20, 2022)

    What's Changed

    • fix: closeOnBackdropClick flag is not working by @slartus in https://github.com/AlexGladkov/Odyssey/pull/35
    • closeOnSwipe for modal sheet - true if you want to close on swipe by @slartus in https://github.com/AlexGladkov/Odyssey/pull/36
    • modal popBackStack with optional of animate by @slartus in https://github.com/AlexGladkov/Odyssey/pull/34

    Full Changelog: https://github.com/AlexGladkov/Odyssey/compare/release-1.0.0-beta03...release-1.0.0-beta05

    Source code(tar.gz)
    Source code(zip)
  • release-1.0.0-beta03(Apr 7, 2022)

    What's Changed

    • Rc/release 0.3.1 -> Main by @AlexGladkov in https://github.com/AlexGladkov/Odyssey/pull/12
    • Main -> Develop by @AlexGladkov in https://github.com/AlexGladkov/Odyssey/pull/13
    • Modal bottom sheet height dp to float by @Ephemerayne in https://github.com/AlexGladkov/Odyssey/pull/11
    • Rc/release 0.3.2 by @AlexGladkov in https://github.com/AlexGladkov/Odyssey/pull/14
    • Main -> Develop by @AlexGladkov in https://github.com/AlexGladkov/Odyssey/pull/15
    • Feature/screen remove callback by @AlexGladkov in https://github.com/AlexGladkov/Odyssey/pull/18
    • Rc/release 0.4.0 -> Main by @AlexGladkov in https://github.com/AlexGladkov/Odyssey/pull/19
    • Rc/release 0.4.0 -> Develop by @AlexGladkov in https://github.com/AlexGladkov/Odyssey/pull/20
    • fix: Navigator 'startScreen' param does not apply by @slartus in https://github.com/AlexGladkov/Odyssey/pull/22
    • wrap modal sheet by content by @slartus in https://github.com/AlexGladkov/Odyssey/pull/23
    • fix: maxHeight is not applied by @slartus in https://github.com/AlexGladkov/Odyssey/pull/24
    • getScreenRender and RenderScreen by @slartus in https://github.com/AlexGladkov/Odyssey/pull/26
    • Feature/deep links by @AlexGladkov in https://github.com/AlexGladkov/Odyssey/pull/25
    • custom render modal screen by @slartus in https://github.com/AlexGladkov/Odyssey/pull/29
    • Feature/different navigators by @slartus in https://github.com/AlexGladkov/Odyssey/pull/27
    • Modal Screens Animations + BottomSheet Swipe Gesture by @AlexGladkov in https://github.com/AlexGladkov/Odyssey/pull/31
    • back to screen by name by @slartus in https://github.com/AlexGladkov/Odyssey/pull/30
    • Fix: fast multiple pop back stack by @slartus in https://github.com/AlexGladkov/Odyssey/pull/33

    New Contributors

    • @Ephemerayne made their first contribution in https://github.com/AlexGladkov/Odyssey/pull/11
    • @slartus made their first contribution in https://github.com/AlexGladkov/Odyssey/pull/22

    Full Changelog: https://github.com/AlexGladkov/Odyssey/compare/release-0.2.0...release-1.0.0-beta03

    Source code(tar.gz)
    Source code(zip)
  • release-0.3.4-native-ui(Feb 24, 2022)

  • release-0.2.0(Dec 7, 2021)

    What's Changed

    • Crash android application on version S+ by @Programistich in https://github.com/AlexGladkov/Odyssey/pull/4
    • Screen navigation animations by @AlexGladkov in https://github.com/AlexGladkov/Odyssey/pull/5
    • Develop -> RC by @AlexGladkov in https://github.com/AlexGladkov/Odyssey/pull/9

    New Contributors

    • @Programistich made their first contribution in https://github.com/AlexGladkov/Odyssey/pull/4

    Full Changelog: https://github.com/AlexGladkov/Odyssey/compare/release-0.1.4...release-0.2.0

    Source code(tar.gz)
    Source code(zip)
  • release-0.1.4(Nov 2, 2021)

  • release-0.1.3(Oct 29, 2021)

  • release-0.0.1(Oct 17, 2021)

Owner
Alex
- Mobile Development - People management - Youtube blogger
Alex
Compose-navigation - Set of utils to help with integrating Jetpack Compose and Jetpack's Navigation

Jetpack Compose Navigation Set of utils to help with integrating Jetpack Compose

Adam Kobus 5 Apr 5, 2022
A library that enables Safe Navigation for you Composable destinations when using Jetpack Compose Navigation

A library that enables Safe Navigation for you Composable destinations when using Jetpack Compose Navigation

Roman Levinzon 59 Oct 19, 2022
🧱 Brick - Multiplatform navigation library for Compose.

Brick Take control of your apps Brick is a lightweight library to make navigation. Features Framework free (Router can be injected in any layer of pro

Petr Shubin 43 Jan 1, 2023
Luis David Orellana 11 Jan 1, 2023
Navigation-Compose - A sample to showcase Kotlin, MVVM, Hilt, Coroutines, StateFlow, Jetpack compose

Navigation-Compose A sample to showcase Kotlin, MVVM, Hilt, Coroutines, StateFlo

Mohammadali Rezaei 6 Jul 13, 2022
A Simple Blog App using Jetpack Compose, Flow, Navigation Compose, Room and Firebase

BlogCompose A Simple Blog App using Jetpack Compose, Flow, Navigation Compose, Room and Firebase Instructions Download your Firebase configuration fil

null 4 Oct 10, 2022
Small code generating library for safe Jetpack Compose navigation with no boilerplate.

Compose Destinations A KSP library to use alongside compose navigation. It reduces boilerplate code and is less error-prone since passing arguments be

Rafael Costa 1.9k Jan 5, 2023
This library is a helper for the Android Compose Navigation routes

ComposableRoutes This library is a helper for the Android Compose Navigation routes: generates routes for the annotated screens provides helpers to re

Rostyslav Lesovyi 19 Nov 5, 2022
Compose desktop navigation library

Navipose Compose desktop navigation library Features Now navipose supports basic screen navigation between few screens Examples At first you should cr

null 5 Oct 28, 2022
This repos one of the ways hows how to use Jetpack Compose Navigation along with Dagger 2

Dagger 2 and Jetpack Compose Integration This repository is about a way how to use Dagger 2 for projects which using Jetpack Compose. Here is an artic

Alexey Glukharev 10 Nov 16, 2022
Create Bottom Navigation Bar with Jetpack Compose

BottomNavigationBarComposeExample Create Bottom Navigation Bar with Jetpack Compose https://johncodeos.com/how-to-create-bottom-navigation-bar-with-je

JohnCodeos.com 31 Dec 24, 2022
🚀 Android project template with Compose, MVVM, Hilt and Navigation

compose-android-template An Android project template with MVVM, Hilt, Navigation and Compose ✍️ Author ?? theapache64 Twitter: @theapache64 Email: the

theapache64 55 Jan 3, 2023
Small Android project demonstrating some navigation components for Jetpack Compose.

Small Android project demonstrating some navigation components for Jetpack Compose. Created this for presenting about this topic for a GDG meetup.

Parshav 3 Sep 15, 2021
Kotlin, MVVM, Navigation Component, Hilt, Jetpack Compose, Retrofit2

What is this project? This course will replace my old java mvvm introduction: https://codingwithmitch.com/courses/rest-api-mvvm-retrofit2/. Watch the

Mitch Tabian 452 Jan 1, 2023
[Tutorial] D-pad navigation in Jetpack Compose

dpad-compose D-pad navigation in Jetpack Compose The problem While Android is mostly used on touch devices, the operating system can also be used with

Walter Berggren 34 Nov 4, 2022
Missing safe arguments generator for Compose Navigation

Safe Arguments Generator Yet another attempt to add safe arguments to Compose Navigation. Why Since routes in Navigation Component don't support safe

Vitali Olshevski 9 Nov 3, 2022
Android Sample Kotlin+ MVI + Jetpack compose + Coroutines + Retrofit + Hilt + Room + Navigation component

MVIComposeSample Android Sample app to show user latest movies implementing MVI + Clean Architecture using kotlin & Jetpack compose following solid an

Ahmed Atwa 10 Dec 28, 2022
Android App made by Jetpack Compose Components with Kotlin, MVVM Pattern, Multi Module, Navigation, Hilt, Coroutines, Retrofit and cached data by Room

Android App made by Jetpack Compose Components with Kotlin, MVVM Pattern, Multi Module, Navigation, Hilt, Coroutines, Retrofit and cached data by Room

Yogi Dewansyah 13 Aug 31, 2022
Android App made by Jetpack Compose Components with Kotlin, MVVM Pattern, Multi Module, Navigation, Hilt, Coroutines, Retrofit and cached data by Room

Mobile Banking Android App made by Jetpack Compose Components with Kotlin, MVVM Pattern, Multi Module, Navigation, Hilt, Coroutines, Retrofit and cach

Yogi Dewansyah 13 Aug 31, 2022