Skip to content

Instantly share code, notes, and snippets.

View Morfly's full-sized avatar

Pavlo Stavytskyi Morfly

View GitHub Profile
abstract class MovieSearchEntry : FeatureEntry {
final override val featureRoute = "movie-search"
}
NavHost(startDestination = "movie-details/{movieId}") {
...
composable(
"movie-details/{movieId}",
arguments = listOf(navArgument("movieId") { type = NavType.IntType })
) {
MovieDetailsScreen(backStackEntry.arguments?.getString("movieId"), ...)
}
}
interface CommonProvider {
val appContext: Context
}
@Singleton
@Component
interface AppComponent {
val appContext: Context
@Component.Factory
interface Factory {
fun create(@BindsInstance appContext: Context): AppComponent
}
@Module(
includes = [
MovieSearchEntryModule::class,
MovieDetailsEntryModule::class
]
)
interface NavigationModule
@Module
interface MovieSearchEntryModule {
@Binds
@Singleton
@IntoMap
@FeatureEntryKey(MovieSearchEntry::class)
fun movieSearchEntry(impl: MovieSearchEntryImpl): FeatureEntry
}
@Composable
inline fun <reified VM : ViewModel> injectedViewModel(
key: String? = null,
crossinline viewModelInstanceCreator: () -> VM
): VM {
val factory = remember(key) {
object : ViewModelProvider.Factory {
override fun <VM : ViewModel> create(modelClass: Class<VM>): VM {
@Suppress("UNCHECKED_CAST")
return viewModelInstanceCreator() as VM
interface DataProvider {
val moviesRepository: MoviesRepository
}
val destinations: Destinations = ...
val movieDetailsDestination = destinations
.find<MovieDetailsEntry>()
.destination(movieId)
navController.navigate(movieDetailsDestination)
import androidx.navigation.compose.composable
import androidx.navigation.navigation
class MovieDetailsEntryImpl @Inject constructor() : MovieDetailsEntry() {
override fun NavGraphBuilder.navigation(
navController: NavHostController,
destinations: Destinations
) {
navigation(startDestination = destination(), route = "@ignored") {