android 在单个“活动”应用程序中确定Hilt依赖项的范围

cqoc49vn  于 2023-05-27  发布在  Android
关注(0)|答案(1)|浏览(114)

我有一个单一的活动Android应用程序,使用Jetpack编写,Hilt和Firebase。在这个应用程序中,Hilt用于注入Repository Singleton,它本身注入FirebaseAuthFirebaseFirestore,以获取与当前用户相关联的数据。

// MyMainActivity.kt

@AndroidEntryPoint
class MyMainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MyApp()
        }
    }
}

@Composable
private fun MyApp() {
    NavHost(
        navController = rememberNavController(),
        startDestination = "login"
    ) {
        composable("login") {
            LoginScreen(viewModel: LoginViewModel = hiltViewModel())
        }
        composable("home") {
            HomeScreen(viewModel: HomeViewModel = hiltViewModel())
        }
    }
}
// HomeViewModel.kt

@HiltViewModel
class HomeViewModel @Inject constructor(
    private val repository: Repository
) { ... }
// MyAppModule.kt

@Module
@InstallIn(SingletonComponent::class)
class AppModule {

    @Provides
    fun provideFirebaseAuth() = FirebaseAuth.getInstance()

    @Provides
    fun provideFirebaseFirestore() = FirebaseFirestore.getInstance()

    ...

    @Singleton
    @Provides
    fun provideRepository(
        firestore: FirebaseFirestore,
        auth: FirebaseAuth,
    ) = Repository(firestore, auth)

    ...
}

当用户注销应用程序时,他们将被定向回MyApp()中的NavHost中的Composable LoginScreen。但是,当使用其他用户登录时,旧用户的数据当前仍在HomeScreen上可见。发生这种情况的原因是,由于应用程序的Hilt模块的范围是MainActivity(并且主活动永远不会被破坏),因此无法使用包含新用户信息的新FirebaseAuth示例重新创建Repository
有可能有一个2-活动应用程序。一个UnauthenticatedActivityAuthenticatedActivity,它允许Repository的作用域为AuthenticatedActivity,并在用户登录时重新生成。然而,到目前为止,单一Activity方法的简单性已经很好了,感觉应该有一种方法来限制对Composables的依赖关系,或者至少应该有一种方法来强制Hilt模块在Activity中重建自己?
从本质上讲,是否有一种方法可以确保当用户重新登录时,Hilt模块重新构建Repository Singleton,同时也保持应用程序的单一Activity架构?

xu3bshqb

xu3bshqb1#

如果你的主页和登录页面有不同的viewModel,那么你可以在providesRepository函数上使用@viewModelScoped注解来将范围限定到HomeViewModel。

@Singleton
    @ViewModelScoped
    @Provides
    fun provideRepository(
        firestore: FirebaseFirestore,
        auth: FirebaseAuth,
    ) = Repository(firestore, auth)

相关问题