Description
A KSP library to improve Compose Navigation. It processes annotations with KSP to generate code that uses Compose Navigation under the hood.
Features:
- Typesafe navigation arguments
- Simple but configurable navigation graphs setup
- Navigation animations through integration with Accompanist Navigation Animation
- Bottom sheet screens through integration with Accompanist Navigation Material
- Easy deep linking to screens
Compose Destinations alternatives and similar packages
Based on the "Navigation" category.
Alternatively, view compose-destinations alternatives based on common mentions on social networks and blogs.
-
Bubble Navigation
🎉 [Android Library] A light-weight library to easily make beautiful Navigation Bar with ton of 🎨 customization option. -
AnimatedBottomBar
A customizable and easy to use BottomBar navigation view with sleek animations, with support for ViewPager, ViewPager2, NavController, and badges. -
Alligator
Alligator is Android navigation library that will help to organize your navigation code in clean and testable way. -
PagerSlidingTabStrip
An interactive indicator to navigate between the different pages of a ViewPager -
Okuki
Okuki is a simple, hierarchical navigation bus and back stack for Android, with optional Rx bindings, and Toothpick DI integration. -
Dual-color-Polyline-Animation
This library will help to show the polyline in dual color similar as Uber. -
Facilis
A sleek, out of the box, easy to understand and use, swipe gesture based Navigational Library for android. -
AndroidBriefActions
DISCONTINUED. Android library for sending and observing non persistent actions such as showing a message; nice readable way to call navigation actions from ViewModel or Activity/Fragment.
CodeRabbit: AI Code Reviews for Developers
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of Compose Destinations or a related project?
README
Compose Destinations
A KSP library that processes annotations and generates code that uses Official Jetpack Compose Navigation under the hood. It hides the complex, non-type-safe and boilerplate code you would have to write otherwise. No need to learn a whole new framework to navigate - most APIs are either the same as with the Jetpack Components or inspired by them.
Main features
- Typesafe navigation arguments
- Simple but configurable navigation graphs setup
- Navigating back with a result in a simple and type-safe way
- Getting the navigation arguments from the
SavedStateHandle
(useful in ViewModels) andNavBackStackEntry
in a type-safe way. - Navigation animations through integration with Accompanist Navigation-Animation
- Bottom sheet screens through integration with Accompanist Navigation-Material
- Easy deep linking to screens
- All you can do with Official Jetpack Compose Navigation but in a simpler safer way!
For a deeper look into all the features, check our documentation website.
Materials
- Alex Styl's quick introduction videos Navigate using the Compose Destinations library
- Philipp Lackner's Youtube video Compose Navigation Just Got SO MUCH EASIER 😱
- Rafael Costa's blog post Compose Destinations: simpler and safer navigation in Compose with no compromises
- Yanneck Reiß's blog post Type Safe Navigation With Jetpack Compose Destinations
- Google Dev Expert Kenji Abe's blog post Navigation Composeを便利にしてくれるライブラリ
- aseem wangoo's blog post (and Youtube video inside): Using compose destinations
- Vincent Tsen post in Android Kotlin Weekly How to convert your Jetpack Compose navigation app to use Compose Destinations Library to get rid of boilerplate code?
Basic Usage
- Annotate your screen Composables with
@Destination
:
@Destination
@Composable
fun ProfileScreen() { /*...*/ }
- Add navigation arguments to the function declaration:
@Destination
@Composable
fun ProfileScreen(
id: Int, // <-- required navigation argument
groupName: String?, // <-- optional navigation argument
isOwnUser: Boolean = false // <-- optional navigation argument
) { /*...*/ }
Parcelable
, Serializable
, Enum
and classes annotated with @kotlinx.serialization.Serializable
(as well as Array
s and ArrayList
s of these) work out of the box!
You can also make any other type a navigation argument type. Read about it here
There is an alternative way to define the destination arguments in case you don't need to use them inside the Composable (as is likely the case when using ViewModel). Read more here.
Build the project (or
./gradlew kspDebugKotlin
, which should be faster) to generate all the Destinations. With the above annotated composable, aProfileScreenDestination
file (that we'll use in step 4) would be generated.Use the generated
[ComposableName]Destination
invoke method to navigate to it. It will have the correct typed arguments.
@RootNavGraph(start = true) // sets this as the start destination of the default nav graph
@Destination
@Composable
fun HomeScreen(
navigator: DestinationsNavigator
) {
/*...*/
navigator.navigate(ProfileScreenDestination(id = 7, groupName = "Kotlin programmers"))
}
DestinationsNavigator is a wrapper interface to NavController that if declared as a parameter, will be provided for free by the library. NavController can also be provided in the exact same way, but it ties your composables to a specific implementation which will make it harder to test and preview. Read more here
- Finally, add the NavHost call:
DestinationsNavHost(navGraph = NavGraphs.root)
NavGraphs
is a generated file that describes your navigation graphs and their destinations. By default all destinations will belong to "root" (@RootNavGraph), but you can create your own nav graphs annotations to have certain screens in other navigation graphs.
This call adds all annotated Composable functions as destinations of the Navigation Host.
That's it! No need to worry about routes, NavType
, bundles and strings. All that redundant and
error-prone code gets generated for you.
Setup
Compose destinations is available via maven central.
1. Add the KSP plugin:
Note: The version you chose for the KSP plugin depends on the Kotlin version your project uses. You can check https://github.com/google/ksp/releases for the list of KSP versions, then pick the last release that matches your Kotlin version. Example: If you're using
1.6.21
Kotlin version, then the last KSP version is1.6.21-1.0.6
.
groovy - build.gradle(:module-name)
plugins {
//...
id 'com.google.devtools.ksp' version '1.6.21-1.0.6' // Depends on your kotlin version
}
kotlin - build.gradle.kts(:module-name)
plugins {
//...
id("com.google.devtools.ksp") version "1.6.21-1.0.6" // Depends on your kotlin version
}
2. Add the dependencies:
Compose Destinations has multiple active versions. The higher one uses the latest versions for Compose and Accompanist, while the others use only stable versions. Choose the one that matches your Compose version, considering this table:
Compose 1.1 (1.1.x) Compose 1.2 (1.2.x) Compose 1.3 (1.3.x)
Warning: If you choose a version that uses a higher version of Compose than the one you're setting for your app, gradle will upgrade your Compose version via transitive dependency.
groovy - build.gradle(:module-name)
implementation 'io.github.raamcosta.compose-destinations:core:<version>'
ksp 'io.github.raamcosta.compose-destinations:ksp:<version>'
kotlin - build.gradle.kts(:module-name)
implementation("io.github.raamcosta.compose-destinations:core:<version>")
ksp("io.github.raamcosta.compose-destinations:ksp:<version>")
Note: If you want to use animations between screens and/or bottom sheet screens, replace above core dependency with:
implementation 'io.github.raamcosta.compose-destinations:animations-core:<version>'
this will use Accompanist Navigation-Animation and Accompanist Navigation-Material internally. Read more about the next steps to configure these features here
3. And finally, you need to make sure the IDE looks at the generated folder.
See KSP related issue.
Here is an example of how to do that for all your build variants (inside android
block):
Warning: Replace
applicationVariants
withlibraryVariants
if the module uses'com.android.library'
plugin!
groovy - build.gradle(:module-name)
applicationVariants.all { variant ->
kotlin.sourceSets {
getByName(variant.name) {
kotlin.srcDir("build/generated/ksp/${variant.name}/kotlin")
}
}
}
kotlin - build.gradle.kts(:module-name)
applicationVariants.all {
kotlin.sourceSets {
getByName(name) {
kotlin.srcDir("build/generated/ksp/$name/kotlin")
}
}
}
About
The library is now in its beta stage, which means that I am happy with the core feature set. If the APIs change, I will provide a migration path. Please do try it and open issues if you find any. If you're interested in contributing, reach out via twitter DM.
Any feedback and contributions are highly appreciated!
If you like the library, consider starring and sharing it with your colleagues.
*Note that all licence references and agreements mentioned in the Compose Destinations README section above
are relevant to that project's source code only.