我正在尝试使用Dagger2制作小型Firebase登录应用,但GoogleSignInOptions出现问题。我想在AppModule中进行设置,但是.requestIdToken出现以下错误:(getString(R.string.default_web_client_id))我使用GoogleSignInOptions的方法合适吗?也许这是错误的方式?对此感到抱歉,但是我对Firebase的注入感到困惑。
@Module
class AppModule {
@Provides
fun getApp(application: Application?): Boolean {
return application == null
}
@Singleton
@Provides
fun provideFirebaseAuthInstance(): FirebaseAuth {
return FirebaseAuth.getInstance()
}
@Singleton
@Provides
fun provideGoogleSignInClient() : GoogleSignInOptions {
return GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id)) //here is a problem
.requestEmail()
.build()
}
}
将应用程序对象作为参数传递,并使用它来获取所需的字符串
@Singleton
@Provides
fun provideGoogleSignInClient(application: Application) : GoogleSignInOptions {
return GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(application.applicationContext.getString(R.string.default_web_client_id))
.requestEmail()
.build()
}
您需要获取上下文才能使用getString()
方法。
解决此问题的一种方法是使应用程序上下文在那里可用。
您将修改Application子类以添加应用程序上下文引用:
class App : Application(),
HasSupportFragmentInjector,
HasActivityInjector {
@Inject
lateinit var activityInjector: DispatchingAndroidInjector<Activity>
@Inject
lateinit var supportfragmentInjector: DispatchingAndroidInjector<Fragment>
override fun onCreate() {
super.onCreate()
appContext = this
DaggerApplicationComponent
.create()
.inject(this)
}
override fun activityInjector(): AndroidInjector<Activity> = activityInjector
override fun supportFragmentInjector(): AndroidInjector<Fragment> = supportfragmentInjector
}
lateinit var appContext: Context
internal set
然后您可以在依赖项注入模块中使用该appContext
引用:
@Singleton
@Provides
fun provideGoogleSignInClient() : GoogleSignInOptions {
return GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(appContext.getString(R.string.default_web_client_id))
.requestEmail()
.build()
}
另一种选择是使用依赖注入来提供应用程序上下文,有关更多信息,请参见此处:https://github.com/google/dagger/issues/832