Issue#41 Update Hilt Entry Point access in compose
This commit is contained in:
parent
e9028c0e86
commit
6a0bb381a8
6 changed files with 49 additions and 61 deletions
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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)) {
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue