【问题标题】:DaggerIntentService pug: No injector factory bound for Class<>DaggerIntentService pug:没有注入器工厂绑定到 Class<>
【发布时间】:2019-11-17 10:31:50
【问题描述】:

我有一个名为 LoginService 的 IntentService 我尝试使用 LoginScope 将它贡献给 loginActivity

将登录活动贡献给 Dagger Graph:

    @LoginScope
@ContributesAndroidInjector(
        modules = {
                LoginViewModelModule.class,
                LoginFragmentBuilderModule.class,
                LoginNetworkBuilderModule.class,
                LoginServiceBulderModule.class
        }
)
abstract LoginActivity contributeLoginActivity();

另外,我尝试贡献将 DaggerIntentService 扩展至 Graph 的 LoginService:

LoginServiceBulderModule.class:

    @ContributesAndroidInjector
abstract LoginService contributeLoginService();

登录服务类:

public class LoginService extends DaggerIntentService {
private static final String TAG = "LoginService";

@Inject
LoginFirebaseHelper loginFirebaseHelper;

public LoginService() {
    super("LoginService");
}

@Override
protected void onHandleIntent(Intent intent) {
    Log.d(TAG, "onHandleIntent: LoginService");
    if (intent.getAction().equals(Constants.ACTION_START_LOGIN)){
        String oracle = intent.getStringExtra(Constants.ORACLE);
        String password = intent.getStringExtra(Constants.PASSWORD);
        loginFirebaseHelper.startLoginFB(oracle, password);
    }
}}

我提供了 LoginFirebaseHelper: LoginNetworkBuilderModule.class:

    @LoginScope
@Provides
static LoginFirebaseHelper provideLoginFirebaseHelper(Application application, DatabaseReference databaseReference, FirebaseAuth firebaseAuth){
    return new LoginFirebaseHelper(application, databaseReference, firebaseAuth);
}

当我在@Singlton 上的应用程序顶层贡献 Loginservice 时,代码工作正常(当我在 AppModule 上提供 LoginFirebaseHelper 并通过 LoginNetworkBuilderModule.lass 将 Loginservice 贡献给 App 组件时) 但是当我使用上面的代码时,我得到了下一个哈巴狗

     Caused by: java.lang.IllegalArgumentException: No injector factory bound for Class<....core.network.service.LoginService>

【问题讨论】:

    标签: android dependency-injection dagger-2 android-mvvm


    【解决方案1】:

    您需要在应用程序中安装为您的服务声明 @ContributesAndroidInjector 的模块。

    只有这样 dagger-support-framework 才能为您的 LoginService 找到注入器工厂。

    要理解,只需将 LoginServiceBulderModule 安装到应用组件中即可。

    @Singleton
    @Component(modules = {LoginServiceBulderModule.class}) // you need to install it here 
    interface AppComponent {
    
    }
    

    我假设您的应用程序类实现了 HasAndroidInjector。如果不遵循https://www.dagger.dev 中提到的关于如何使用 Dagger Support Android Framework 的指南。

    【讨论】:

    • 当我在 Singlton 上的应用程序的顶层贡献 Loginservice 时,代码工作正常(当我在 AppModule 上提供 LoginFirebaseHelper 并通过 LoginNetworkBuilderModule.class 和 LoginServiceBulderModule.class 将 Loginservice 贡献给 AppComponent)但是当我在 LoginActivity 的 Loginscope 中贡献 Loginservice 我得到了上面的哈巴狗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多