Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Copyright 2024 Sergio Belda
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dev.sergiobelda.navigation.compose.extended
import androidx.compose.animation.AnimatedContentScope
import androidx.compose.animation.AnimatedContentTransitionScope
import androidx.compose.animation.EnterTransition
import androidx.compose.animation.ExitTransition
import androidx.compose.runtime.Composable
import androidx.compose.ui.window.DialogProperties
import androidx.navigation.NamedNavArgument
import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavDeepLink
import androidx.navigation.NavGraph
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import androidx.navigation.compose.dialog
import androidx.navigation.compose.navigation
import kotlin.jvm.JvmSuppressWildcards
/**
* Add the [Composable] to the [NavGraphBuilder]
*
* @param navDestination navigation destination associated with the composable
* @param arguments list of arguments to associate with destination
* @param deepLinks list of deep links to associate with the destinations
* @param enterTransition callback to determine the destination's enter transition
* @param exitTransition callback to determine the destination's exit transition
* @param popEnterTransition callback to determine the destination's popEnter transition
* @param popExitTransition callback to determine the destination's popExit transition
* @param content composable for the destination
*/
fun NavGraphBuilder.composable(
navDestination: NavDestination<*>,
arguments: List = navDestination.arguments,
deepLinks: List = navDestination.deepLinks,
enterTransition: (@JvmSuppressWildcards AnimatedContentTransitionScope.() -> EnterTransition?)? = null,
exitTransition: (@JvmSuppressWildcards AnimatedContentTransitionScope.() -> ExitTransition?)? = null,
popEnterTransition: (@JvmSuppressWildcards AnimatedContentTransitionScope.() -> EnterTransition?)? = enterTransition,
popExitTransition: (@JvmSuppressWildcards AnimatedContentTransitionScope.() -> ExitTransition?)? = exitTransition,
content: @Composable AnimatedContentScope.(NavBackStackEntry) -> Unit,
) {
composable(
route = navDestination.route,
arguments = arguments,
deepLinks = deepLinks,
enterTransition = enterTransition,
exitTransition = exitTransition,
popEnterTransition = popEnterTransition,
popExitTransition = popExitTransition,
) { navBackStackEntry ->
content(navBackStackEntry)
}
}
/**
* Construct a nested [NavGraph]
*
* @param navDestination navigation destination associated with this NavGraph
* @param startNavDestination the starting destination for this NavGraph
* @param arguments list of arguments to associate with destination
* @param deepLinks list of deep links to associate with the destinations
* @param enterTransition callback to define enter transitions for destination in this NavGraph
* @param exitTransition callback to define exit transitions for destination in this NavGraph
* @param popEnterTransition callback to define pop enter transitions for destination in this
* NavGraph
* @param popExitTransition callback to define pop exit transitions for destination in this NavGraph
* @param builder the builder used to construct the graph
*
* @return the newly constructed nested NavGraph
*/
fun NavGraphBuilder.navigation(
navDestination: NavDestination<*>,
startNavDestination: NavDestination<*>,
arguments: List = navDestination.arguments,
deepLinks: List = navDestination.deepLinks,
enterTransition: (AnimatedContentTransitionScope.() -> EnterTransition?)? =
null,
exitTransition: (AnimatedContentTransitionScope.() -> ExitTransition?)? =
null,
popEnterTransition: (
AnimatedContentTransitionScope.() -> EnterTransition?
)? = enterTransition,
popExitTransition: (
AnimatedContentTransitionScope.() -> ExitTransition?
)? = exitTransition,
builder: NavGraphBuilder.() -> Unit,
) {
navigation(
startDestination = startNavDestination.route,
route = navDestination.route,
arguments = arguments,
deepLinks = deepLinks,
enterTransition = enterTransition,
exitTransition = exitTransition,
popEnterTransition = popEnterTransition,
popExitTransition = popExitTransition,
builder = builder,
)
}
/**
* Add the [Composable] to the [NavGraphBuilder] that will be hosted within a
* [androidx.compose.ui.window.Dialog]. This is suitable only when this dialog represents
* a separate screen in your app that needs its own lifecycle and saved state, independent
* of any other destination in your navigation graph. For use cases such as `AlertDialog`,
* you should use those APIs directly in the [composable] destination that wants to show that
* dialog.
*
* @param navDestination navigation destination associated with the composable
* @param arguments list of arguments to associate with destination
* @param deepLinks list of deep links to associate with the destinations
* @param dialogProperties properties that should be passed to [androidx.compose.ui.window.Dialog].
* @param content composable content for the destination that will be hosted within the Dialog
*/
fun NavGraphBuilder.dialog(
navDestination: NavDestination<*>,
arguments: List = navDestination.arguments,
deepLinks: List = navDestination.deepLinks,
dialogProperties: DialogProperties = DialogProperties(),
content: @Composable (NavBackStackEntry) -> Unit,
) {
dialog(
route = navDestination.route,
arguments = arguments,
deepLinks = deepLinks,
dialogProperties = dialogProperties,
) { navBackStackEntry ->
content(navBackStackEntry)
}
}