我有一个单一的活动Android应用程序,使用Jetpack编写,Hilt和Firebase。在这个应用程序中,Hilt用于注入Repository
Singleton,它本身注入FirebaseAuth
和FirebaseFirestore
,以获取与当前用户相关联的数据。
// 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-活动应用程序。一个UnauthenticatedActivity
和AuthenticatedActivity
,它允许Repository
的作用域为AuthenticatedActivity
,并在用户登录时重新生成。然而,到目前为止,单一Activity方法的简单性已经很好了,感觉应该有一种方法来限制对Composables的依赖关系,或者至少应该有一种方法来强制Hilt模块在Activity中重建自己?
从本质上讲,是否有一种方法可以确保当用户重新登录时,Hilt模块重新构建Repository
Singleton,同时也保持应用程序的单一Activity架构?
1条答案
按热度按时间xu3bshqb1#
如果你的主页和登录页面有不同的viewModel,那么你可以在providesRepository函数上使用@viewModelScoped注解来将范围限定到HomeViewModel。