Issue#41 Update Hilt Entry Point access in compose

This commit is contained in:
Gergely Hegedus 2022-09-29 11:21:11 +03:00
parent e9028c0e86
commit 6a0bb381a8
6 changed files with 49 additions and 61 deletions

View file

@ -1,4 +1,4 @@
package org.fnives.test.showcase.hilt.compose.screen.home
package org.fnives.test.showcase.hilt.compose.di
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
@ -11,13 +11,30 @@ import org.fnives.test.showcase.hilt.core.content.AddContentToFavouriteUseCase
import org.fnives.test.showcase.hilt.core.content.FetchContentUseCase
import org.fnives.test.showcase.hilt.core.content.GetAllContentUseCase
import org.fnives.test.showcase.hilt.core.content.RemoveContentFromFavouritesUseCase
import org.fnives.test.showcase.hilt.core.login.IsUserLoggedInUseCase
import org.fnives.test.showcase.hilt.core.login.LoginUseCase
import org.fnives.test.showcase.hilt.core.login.LogoutUseCase
object HomeEntryPoint {
object ComposeEntryPoint {
/**
* Helper method to easily remember and access Hilt Dependencies in Compose.
*/
@Composable
inline fun <reified T : Any> rememberEntryPoint(component: Any = LocalContext.current.applicationContext): T =
remember(component) { EntryPoints.get(component, T::class.java) }
sealed interface EntryPointDependencies
@EntryPoint
@InstallIn(SingletonComponent::class)
interface MainDependencies {
interface AuthDependencies : EntryPointDependencies {
val loginUseCase: LoginUseCase
}
@EntryPoint
@InstallIn(SingletonComponent::class)
interface MainDependencies : EntryPointDependencies {
val getAllContentUseCase: GetAllContentUseCase
val logoutUseCase: LogoutUseCase
val fetchContentUseCase: FetchContentUseCase
@ -25,9 +42,9 @@ object HomeEntryPoint {
val removeContentFromFavouritesUseCase: RemoveContentFromFavouritesUseCase
}
@Composable
fun get(): MainDependencies {
val context = LocalContext.current.applicationContext
return remember { EntryPoints.get(context, MainDependencies::class.java) }
@EntryPoint
@InstallIn(SingletonComponent::class)
interface AppNavigationDependencies : EntryPointDependencies {
val isUserLoggedInUseCase: IsUserLoggedInUseCase
}
}

View file

@ -11,6 +11,8 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import kotlinx.coroutines.delay
import org.fnives.test.showcase.hilt.compose.di.ComposeEntryPoint.AppNavigationDependencies
import org.fnives.test.showcase.hilt.compose.di.ComposeEntryPoint.rememberEntryPoint
import org.fnives.test.showcase.hilt.compose.screen.auth.AuthScreen
import org.fnives.test.showcase.hilt.compose.screen.auth.rememberAuthScreenState
import org.fnives.test.showcase.hilt.compose.screen.home.HomeScreen
@ -20,8 +22,11 @@ import org.fnives.test.showcase.hilt.core.login.IsUserLoggedInUseCase
@Composable
fun AppNavigation(
isUserLogeInUseCase: IsUserLoggedInUseCase = AppNavigationEntryPoint.get().isUserLoggedInUseCase
) {
navigationDependencies: AppNavigationDependencies = rememberEntryPoint()
) = AppNavigation(navigationDependencies.isUserLoggedInUseCase)
@Composable
fun AppNavigation(isUserLogeInUseCase: IsUserLoggedInUseCase) {
val navController = rememberNavController()
LaunchedEffect(isUserLogeInUseCase) {

View file

@ -1,25 +0,0 @@
package org.fnives.test.showcase.hilt.compose.screen
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import dagger.hilt.EntryPoint
import dagger.hilt.EntryPoints
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import org.fnives.test.showcase.hilt.core.login.IsUserLoggedInUseCase
object AppNavigationEntryPoint {
@EntryPoint
@InstallIn(SingletonComponent::class)
interface AppNavigationDependencies {
val isUserLoggedInUseCase: IsUserLoggedInUseCase
}
@Composable
fun get(): AppNavigationDependencies {
val context = LocalContext.current.applicationContext
return remember { EntryPoints.get(context, AppNavigationDependencies::class.java) }
}
}

View file

@ -1,25 +0,0 @@
package org.fnives.test.showcase.hilt.compose.screen.auth
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import dagger.hilt.EntryPoint
import dagger.hilt.EntryPoints
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import org.fnives.test.showcase.hilt.core.login.LoginUseCase
object AuthEntryPoint {
@EntryPoint
@InstallIn(SingletonComponent::class)
interface AuthDependencies {
val loginUseCase: LoginUseCase
}
@Composable
fun get(): AuthDependencies {
val context = LocalContext.current.applicationContext
return remember { EntryPoints.get(context, AuthDependencies::class.java) }
}
}

View file

@ -11,6 +11,8 @@ import androidx.compose.runtime.setValue
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.fnives.test.showcase.hilt.compose.di.ComposeEntryPoint.AuthDependencies
import org.fnives.test.showcase.hilt.compose.di.ComposeEntryPoint.rememberEntryPoint
import org.fnives.test.showcase.hilt.core.login.LoginUseCase
import org.fnives.test.showcase.model.auth.LoginCredentials
import org.fnives.test.showcase.model.auth.LoginStatus
@ -19,7 +21,19 @@ import org.fnives.test.showcase.model.shared.Answer
@Composable
fun rememberAuthScreenState(
stateScope: CoroutineScope = rememberCoroutineScope { Dispatchers.Main },
loginUseCase: LoginUseCase = AuthEntryPoint.get().loginUseCase,
authDependencies: AuthDependencies = rememberEntryPoint(),
onLoginSuccess: () -> Unit = {},
): AuthScreenState =
rememberAuthScreenState(
stateScope = stateScope,
loginUseCase = authDependencies.loginUseCase,
onLoginSuccess = onLoginSuccess
)
@Composable
fun rememberAuthScreenState(
stateScope: CoroutineScope = rememberCoroutineScope { Dispatchers.Main },
loginUseCase: LoginUseCase,
onLoginSuccess: () -> Unit = {},
): AuthScreenState {
return rememberSaveable(saver = AuthScreenState.getSaver(stateScope, loginUseCase, onLoginSuccess)) {

View file

@ -9,6 +9,8 @@ import androidx.compose.runtime.setValue
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.launch
import org.fnives.test.showcase.hilt.compose.di.ComposeEntryPoint.MainDependencies
import org.fnives.test.showcase.hilt.compose.di.ComposeEntryPoint.rememberEntryPoint
import org.fnives.test.showcase.hilt.core.content.AddContentToFavouriteUseCase
import org.fnives.test.showcase.hilt.core.content.FetchContentUseCase
import org.fnives.test.showcase.hilt.core.content.GetAllContentUseCase
@ -21,7 +23,7 @@ import org.fnives.test.showcase.model.shared.Resource
@Composable
fun rememberHomeScreenState(
stateScope: CoroutineScope = rememberCoroutineScope(),
mainDependencies: HomeEntryPoint.MainDependencies = HomeEntryPoint.get(),
mainDependencies: MainDependencies = rememberEntryPoint(),
onLogout: () -> Unit = {},
) =
rememberHomeScreenState(