Coder Social home page Coder Social logo

navigation-compose-screen's Introduction

navigation-compose-screen

Screen object support for navigation-compose

Requirements

  • Android Gradle Plugin 8.3.0 or later
  • Jetpack Compose 1.5.4
  • navigation-compose 2.7.1
  • Kotlin 1.9.22
  • minimum SDK version 23 (Android 6.0)

What can I do?

Provide type safe navigation to navigation-compose

// screenBaseClass is optional
@AutoScreenId(
    "ExampleScreen",
    screenBaseClass = MyScreen::class,
)
enum class ExampleScreenId {
    // Deep Link support
    @Route(
        "/",
        deepLinks = ["https://takuji31.jp/compose-navigation/"],
    )
    Home,

    // arguments support
    @Route(
        "/blog/{blogId}",
        stringArguments = [StringArgument("blogId")],
    )
    Blog,

    // auto argument type is String
    @Route("/blog/{blogId}/entry/{entryId}")
    Entry,

    // enum type arguments supported
    @Route(
        "/ranking/?rankingType={rankingType}",
        enumArguments = [
            EnumArgument(
                "rankingType",
                RankingType::class,
                hasDefaultValue = true,
                "daily",
            ),
        ],
    )
    Ranking,

    @Route("/settings")
    Settings,
}

You can use generated screen code in your code!

@Composable
fun Main(navController: ScreenNavController) { // val navController = rememberScreenNavController()
    val currentScreen by navController.currentScreen.collectAsState()
    ScreenNavHost(
        navController = navController,
        startScreen = ExampleScreen.Home,
    ) {
        val onBottomSheetItemClicked: (ExampleScreen) -> Unit = { screen ->
            navController.navigate(screen) {
                popUpTo(ExampleScreenId.Home) { inclusive = screen == ExampleScreen.Home }
            }
        }
        exampleScreenComposable {
            home { screen ->
                val viewModel = navViewModel<HomeViewModel>()
                val state by viewModel.state.collectAsState()
                Home(
                    state = state,
                    screen = screen,
                    onBottomSheetItemClicked = onBottomSheetItemClicked,
                    onReloadButtonClick = { viewModel.reload() },
                    onItemClick = { navController.navigate(ExampleScreen.Blog(it.id)) },
                )
            }
            blog { screen ->
                val viewModel = navViewModel<BlogViewModel>()
                val state by viewModel.state.collectAsState()
                Blog(
                    state = state,
                    screen = screen,
                    onReloadButtonClick = { viewModel.reload() },
                    onItemClick = {
                        navController.navigate(
                            ExampleScreen.Entry(
                                screen.blogId,
                                it.id,
                            ),
                        )
                    },
                )
            }
            // ...
        }
    }
}

Setup

Release

Add JitPack to your repositories

allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'https://jitpack.io' } // or maven("https://jitpack.io") in Kotlin DSL
    }
}

Apply kapt plugin

plugins {
    id("com.android.library")
    id("kotlin-kapt") // or kotlin("kapt") in Kotlin DSL
}

Add dependencies

dependencies {
    implementation("com.github.takuji31.navigation-compose-screen:navigation-compose-screen:+")
    kapt("com.github.takuji31.navigation-compose-screen:compiler:+")
}

navigation-compose-screen's People

Contributors

takuji31 avatar renovate[bot] avatar numeroanddev avatar renovate-bot avatar funnelbit avatar mangano-ito avatar

Stargazers

Takuma Maruyama avatar RyuNen344 avatar Seiya Kokushi avatar TE-KoutarouAkiyoshi avatar Nicolas Aleixo avatar Seiko avatar

Watchers

 avatar James Cloos avatar  avatar  avatar

navigation-compose-screen's Issues

Add option for internal constructor

Add internal modifier for type safety

@ScreenId(
    "ExampleScreen",
)
enum class ExampleScreenId {
    @Route(
        "/blog/{blogId}",
        stringArguments = [StringArgument("blogId")],
        constructorAsInternal = true
    )
    Blog,
}

fun ExampleScreen.Blog.Companion.invoke(id: BlogId) = Blog(blogId = id.rawValue)

// in other module
fun main() {
  ExampleScreen.Blog(id = BlogId("12345"))
  ExampleScreen.Blog(blogId = "12345") // cannot access
}

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Repository problems

These problems occurred while renovating this repository. View logs.

  • WARN: Use matchDepPatterns instead of matchPackagePatterns

Rate-Limited

These updates are currently rate-limited. Click on a checkbox below to force their creation now.

  • Update dependency com.google.truth:truth to v1.4.4
  • Update androidx.test (androidx.test.ext:truth, androidx.test.ext:junit, androidx.test:runner, androidx.test:rules)
  • Update dependency androidx.appcompat:appcompat to v1.7.0
  • Update dependency androidx.core:core-ktx to v1.13.1
  • Update dependency androidx.lifecycle:lifecycle-viewmodel-ktx to v2.8.3
  • Update dependency com.github.tschuchortdev:kotlin-compile-testing-ksp to v1.6.0
  • Update dependency com.google.android.material:material to v1.12.0
  • Update KSP to v2 (major) (com.google.devtools.ksp, com.google.devtools.ksp:symbol-processing-api)
  • Update plugin kotlin to v2
  • ๐Ÿ” Create all rate-limited PRs at once ๐Ÿ”

Open

These updates have all been created already. Click a checkbox below to force a retry/rebase of any.

Detected dependencies

gradle
buildSrc/src/main/kotlin/Publish.kt
buildSrc/src/main/kotlin/Versions.kt
gradle.properties
settings.gradle.kts
build.gradle.kts
annotation/build.gradle.kts
app/build.gradle.kts
  • composeOptions 1.5.10
  • junit:junit 4.13.2
  • androidx.test:rules 1.5.0
  • androidx.test:runner 1.5.2
  • androidx.test.ext:junit 1.1.5
  • androidx.test.ext:truth 1.5.0
  • com.google.truth:truth 1.4.2
  • androidx.activity:activity-ktx 1.8.2
buildSrc/build.gradle.kts
common/build.gradle.kts
compile-testing/build.gradle.kts
  • composeOptions 1.5.10
compiler/build.gradle.kts
gradle/libs.versions.toml
  • androidx.core:core-ktx 1.12.0
  • androidx.appcompat:appcompat 1.6.1
  • com.google.android.material:material 1.11.0
  • androidx.lifecycle:lifecycle-viewmodel-ktx 2.7.0
  • org.jetbrains.kotlinx:kotlinx-coroutines-core 1.7.3
  • org.jetbrains.kotlinx:kotlinx-coroutines-android 1.7.3
  • androidx.compose:compose-bom 2023.10.01
  • androidx.activity:activity-compose 1.8.2
  • androidx.navigation:navigation-compose 2.7.7
  • com.google.dagger:hilt-android 2.51
  • com.google.dagger:hilt-android-compiler 2.51
  • com.google.dagger:hilt-android-testing 2.51
  • androidx.hilt:hilt-navigation 1.2.0
  • androidx.hilt:hilt-navigation-compose 1.2.0
  • com.jakewharton.timber:timber 5.0.1
  • androidx.arch.core:core-testing 2.2.0
  • com.google.devtools.ksp:symbol-processing-api 1.9.22-1.0.17
  • com.squareup:kotlinpoet 1.14.2
  • com.squareup:kotlinpoet-metadata 1.14.2
  • com.squareup:kotlinpoet-ksp 1.14.2
  • junit:junit 4.13.2
  • com.google.truth:truth 1.4.2
  • com.github.tschuchortdev:kotlin-compile-testing-ksp 1.5.0
  • com.android.application 8.3.0
  • com.android.library 8.3.0
  • org.jetbrains.kotlin.android 1.9.22
  • com.google.devtools.ksp 1.9.22-1.0.17
  • com.google.dagger.hilt.android 2.51
library/build.gradle.kts
  • composeOptions 1.5.10
  • junit:junit 4.13.2
  • androidx.test:rules 1.5.0
  • androidx.test:runner 1.5.2
  • androidx.test.ext:junit 1.1.5
  • androidx.test.ext:truth 1.5.0
  • com.google.truth:truth 1.4.2
navigation/build.gradle.kts
  • composeOptions 1.5.10
gradle-wrapper
gradle/wrapper/gradle-wrapper.properties
  • gradle 8.6

  • Check this box to trigger a request for Renovate to run again on this repository

Crash with deeplink navigation

I faced a crash when trying deeplink navigation in the sample code for this project.

navController.navController.navigate("compose-navigation-example://blog.takuji31.jp/blog/${it.id}".toUri())
Crash Log
java.lang.IllegalStateException: Screen factory for route[/blog/{blogId}] not registered.
        at jp.takuji31.compose.navigation.screen.ScreenFactoryRegistry.findByRoute(ScreenFactoryRegistry.kt:16)
        at jp.takuji31.compose.navigation.screen.ScreenNavController$1.onDestinationChanged(ScreenNavController.kt:20)
        at androidx.navigation.NavController.dispatchOnDestinationChanged(NavController.kt:861)
        at androidx.navigation.NavController.navigate(NavController.kt:1641)
        at androidx.navigation.NavController.navigate(NavController.kt:1577)
        at androidx.navigation.NavController.navigate(NavController.kt:1545)
        at androidx.navigation.NavController.navigate(NavController.kt:1528)
        at androidx.navigation.NavController.navigate(NavController.kt:1475)
        at jp.takuji31.compose.navigation.example.ui.MainKt$Main$1$1$1$4.invoke(Main.kt:53)
        at jp.takuji31.compose.navigation.example.ui.MainKt$Main$1$1$1$4.invoke(Main.kt:51)
        at jp.takuji31.compose.navigation.example.ui.HomeKt$Home$2$1$1$1.invoke(Home.kt:69)
        at jp.takuji31.compose.navigation.example.ui.HomeKt$Home$2$1$1$1.invoke(Home.kt:69)

Also, if initialized Screen and called the ScreenFactoryRegistry before the deeplink navigation, it didn't crash.

ExampleScreen.Blog(it.id)
navController.navController.navigate("compose-navigation-example://blog.takuji31.jp/blog/${it.id}".toUri())

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.