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.Composable
import androidx.compose.runtime.remember 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.FetchContentUseCase
import org.fnives.test.showcase.hilt.core.content.GetAllContentUseCase 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.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 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 @EntryPoint
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)
interface MainDependencies { interface AuthDependencies : EntryPointDependencies {
val loginUseCase: LoginUseCase
}
@EntryPoint
@InstallIn(SingletonComponent::class)
interface MainDependencies : EntryPointDependencies {
val getAllContentUseCase: GetAllContentUseCase val getAllContentUseCase: GetAllContentUseCase
val logoutUseCase: LogoutUseCase val logoutUseCase: LogoutUseCase
val fetchContentUseCase: FetchContentUseCase val fetchContentUseCase: FetchContentUseCase
@ -25,9 +42,9 @@ object HomeEntryPoint {
val removeContentFromFavouritesUseCase: RemoveContentFromFavouritesUseCase val removeContentFromFavouritesUseCase: RemoveContentFromFavouritesUseCase
} }
@Composable @EntryPoint
fun get(): MainDependencies { @InstallIn(SingletonComponent::class)
val context = LocalContext.current.applicationContext interface AppNavigationDependencies : EntryPointDependencies {
return remember { EntryPoints.get(context, MainDependencies::class.java) } val isUserLoggedInUseCase: IsUserLoggedInUseCase
} }
} }

View file

@ -11,6 +11,8 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import kotlinx.coroutines.delay 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.AuthScreen
import org.fnives.test.showcase.hilt.compose.screen.auth.rememberAuthScreenState import org.fnives.test.showcase.hilt.compose.screen.auth.rememberAuthScreenState
import org.fnives.test.showcase.hilt.compose.screen.home.HomeScreen import org.fnives.test.showcase.hilt.compose.screen.home.HomeScreen
@ -20,8 +22,11 @@ import org.fnives.test.showcase.hilt.core.login.IsUserLoggedInUseCase
@Composable @Composable
fun AppNavigation( fun AppNavigation(
isUserLogeInUseCase: IsUserLoggedInUseCase = AppNavigationEntryPoint.get().isUserLoggedInUseCase navigationDependencies: AppNavigationDependencies = rememberEntryPoint()
) { ) = AppNavigation(navigationDependencies.isUserLoggedInUseCase)
@Composable
fun AppNavigation(isUserLogeInUseCase: IsUserLoggedInUseCase) {
val navController = rememberNavController() val navController = rememberNavController()
LaunchedEffect(isUserLogeInUseCase) { 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.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch 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.hilt.core.login.LoginUseCase
import org.fnives.test.showcase.model.auth.LoginCredentials import org.fnives.test.showcase.model.auth.LoginCredentials
import org.fnives.test.showcase.model.auth.LoginStatus import org.fnives.test.showcase.model.auth.LoginStatus
@ -19,7 +21,19 @@ import org.fnives.test.showcase.model.shared.Answer
@Composable @Composable
fun rememberAuthScreenState( fun rememberAuthScreenState(
stateScope: CoroutineScope = rememberCoroutineScope { Dispatchers.Main }, 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 = {}, onLoginSuccess: () -> Unit = {},
): AuthScreenState { ): AuthScreenState {
return rememberSaveable(saver = AuthScreenState.getSaver(stateScope, loginUseCase, onLoginSuccess)) { 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.CoroutineScope
import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.launch 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.AddContentToFavouriteUseCase
import org.fnives.test.showcase.hilt.core.content.FetchContentUseCase 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.GetAllContentUseCase
@ -21,7 +23,7 @@ import org.fnives.test.showcase.model.shared.Resource
@Composable @Composable
fun rememberHomeScreenState( fun rememberHomeScreenState(
stateScope: CoroutineScope = rememberCoroutineScope(), stateScope: CoroutineScope = rememberCoroutineScope(),
mainDependencies: HomeEntryPoint.MainDependencies = HomeEntryPoint.get(), mainDependencies: MainDependencies = rememberEntryPoint(),
onLogout: () -> Unit = {}, onLogout: () -> Unit = {},
) = ) =
rememberHomeScreenState( rememberHomeScreenState(