当前位置: 首页 > 知识库问答 >
问题:

如何在Android中获得匕首柄架构中的MyApplication类对象?

劳仲渊
2023-03-14

基本上我正在从匕首迁移到剑柄。所以我必须删除这个参数类 ApplicationModule(application: MyApplication) { 所以,我想从我的匕首剑柄模块传递应用程序类对象的地方很少。 很少有第三部分库。

法典:

@InstallIn(SingletonComponent::class)
@Module
class ApplicationModule(application: MyApplication) {

    private val application: MyApplication = application

....

@Provides
    @Singleton
    fun provideGoogleSignInClient(): GoogleSignInClient {
        val mGoogleSignInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(application.getString(R.string.default_web_client_id))
            .requestProfile()
            .requestEmail()
            .build()
        return GoogleSignIn.getClient(application, mGoogleSignInOptions)
    }

像这样的地方很多。那么我该如何实现这一点呢?

编辑:

@Provides
    @Singleton
    fun provideUserService(): NewUserService {
        return NewUserService(application)
    }
class NewUserService @Inject constructor(@ApplicationContext context: Context) : BaseServices(context) {

共有2个答案

鲁辉
2023-03-14

这样做

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


....

@Provides
    @Singleton
    fun provideGoogleSignInClient(@ApplicationContext application): GoogleSignInClient {
        val mGoogleSignInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(application.getString(R.string.default_web_client_id))
            .requestProfile()
            .requestEmail()
            .build()
        return GoogleSignIn.getClient(application, mGoogleSignInOptions)
    }

@Provides
    @Singleton
    fun provideUserService(@ApplicationContext application): NewUserService {
        return NewUserService(application)
    }

现在你们的服务阶级会变成这样

class NewUserService (context: Context) : BaseServices(context) {
芮岳
2023-03-14

您可以使用Hilt的@Application ationContext注释将您的应用程序替换为应用程序上下文。进行以下更改:

    @Provides
    @Singleton
    fun provideGoogleSignInClient(@ApplicationContext applicationContext: Context): GoogleSignInClient {
        val mGoogleSignInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(applicationContext.getString(R.string.default_web_client_id))
            .requestProfile()
            .requestEmail()
            .build()
        return GoogleSignIn.getClient(applicationContext, mGoogleSignInOptions)
    }

回答您的进一步问题。当您在模块中提供类时,不需要同时指示Dagger@注入它。您的代码如下:

    @Provides
    @Singleton
    fun provideUserService(@ApplicationContext context: Context): NewUserService {
        return NewUserService(context)
    }

还有你的班级:

class NewUserService (context: Context) : BaseServices(context)

构造函数注入在 Dagger 已经知道如何提供依赖项类的情况下很有用。例如,您有以下内容:

    @Provides
    @Singleton
    fun provideMyClass(@ApplicationContext applicationContext: Context): MyClass {
        val someField = funToReturnValue(applicationContext)

        return MyClass.initialise(someField)
    }

然后,当您有另一个需要<code>MyClass</code>的类时,您可以使用构造函数注入,因为Dagger已经知道如何构造MyClass。你会这样做:

class MySecondClass @Inject constructor(val myClass: MyClass)
 类似资料:
  • 我使用Dagger-Hilt进行依赖注入,但是我不知道如何在抽象类中进行字段注入。 [DI包] 我使用匕首剑柄(AppModule.kt)将“ErrorHandler”作为单例提供 扩展到BaseUseCase以上的用例都是为匕首剑柄(UseCaseModule.kt)编写的。 > 我尝试使用匕首柄(如BaseUseCaseModule.kt)提供或绑定BaseUseCase类,但是由于它具有类型

  • 我正在尝试为我的navControl ler提供匕首柄。但是我使用的方法不起作用。我想提供navControl ler以便通过构造函数注入将其注入我的片段中。 我还创建了FragmentWorks类,以便通过构造函数注入我的依赖项。我知道是这里的问题,但我不知道正确的解决方案… 感谢您的帮助,谢谢! 原因:java.lang.ClassCastException:com.example.app。应

  • 基于本教程使用Dagger Hilt添加子组件需要 这就是如何创建子组件 我的问题是如何实现 因为它没有显示它是如何提供给UserManager类的 我正在尝试创建一个AppComponent来测试子组件如何与Dagger Hilt一起工作 并在应用中 我应该如何在中创建构建器,创建实现Provider的匿名类不正确吗?

  • 问题内容: 我是新手,并尝试构建这样的示例以了解其工作原理。 有我的示例代码: 如您在我注入的样本中所见 我也想使用提供值作为此方法的参数。 最终我得到了这样的错误 我究竟做错了什么? 我应该如何以正确的方式提供此参数以避免此类错误? 问题答案: 您需要使用 限定符注释 并在注入依赖时使用此限定符 希望能帮助到你!另请查看官方文档-http: //google.github.io/dagger/

  • 问题内容: 我可能错过了一些东西,但我认为像@Singleton这样的作用域用于定义“作用域生命周期”。 我在Android应用程序中使用了Dagger 2(但我认为问题根本与android相关)。 我有1个模块: 我有两个与范围不同的组件: 两者,并且,有一个构造函数。虽然MenuPresenter期望将其作为参数,但LoginPresenter却采用了: 但是每次我使用这些组件创建一个或时,都

  • 我想在单元测试模块中使用我的领域管理器。我做的 然后我想实现 但是realmManager为空。如何使用匕首2编写简单的模块测试?我用了匕首模拟,但没有用。我的模块包含 我尝试了谷歌的一切,但我不知道如何从图形中注入对象。