java.lang.IllegalArgumentException:没有为Class <MyActivity_>绑定的注入器工厂

ale*_*bel 7 android android-annotations dagger dagger-2

我遇到的错误如下:

引起:java.lang.IllegalArgumentException:没有为Class绑定的进程工厂.注射器工厂被绑定为MyActivity_的超类型:[MyActivity].你的意思是绑定注射器工厂的子类型?

据我所知,这是因为我正在使用AndroidAnnotations库.

AppComponent.class:

@Singleton
@Component(modules = {
    AndroidInjectionModule.class,
    AppModule.class,
    ActivityBindingModule.class })
public interface AppComponent extends AndroidInjector<DaggerApplication> {

    @Component.Builder
    interface Builder {
         @BindsInstance Builder application(Application application);
         AppComponent build();
    }

    void inject(Application application);

    @Override
    void inject(DaggerApplication instance);
}
Run Code Online (Sandbox Code Playgroud)

AppModule.class:

@Module
public abstract class AppModule {

    @Binds
    abstract Context provideContext(Application application);

    @Provides
    @Singleton
    static SharedPreferencesManager providesPreferences(Application application){
        return SharedPreferencesManager_.getInstance_(application);
    }
}
Run Code Online (Sandbox Code Playgroud)

ActivityBindingModule.class:

@Module
public abstract class ActivityBindingModule {

    @ContributesAndroidInjector(modules = LoginActivityModule.class)
    @LoginActivityScope
    abstract LoginActivity bindLoginActivity();
}
Run Code Online (Sandbox Code Playgroud)

Application.class:

@EApplication
public class Application extends DaggerApplication {

    @Inject
    DispatchingAndroidInjector<Activity> activityDispatchingAndroidInjector;

    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
        AppComponent appComponent = DaggerAppComponent.builder()
            .application(this)
            .build();

        appComponent.inject(this);
        return appComponent;
    }
}
Run Code Online (Sandbox Code Playgroud)

LoginActivityModule.class

@Module
public class LoginActivityModule {

    @Provides
    @LoginActivityScope
    @ActivityContext
    public Context providesContext(LoginActivity loginActivity){
        return loginActivity;
    }

    @Provides
    @LoginActivityScope
    public LoginViewModel providesLoginViewModel(TelephonyManager telephonyManager,
                                             LoginModel loginModel,
                                             SharedPreferencesManager sharedPreferencesManager,
                                             LoginRemoteRepository loginRemoteRepository){
        return new LoginViewModel(telephonyManager, loginModel, sharedPreferencesManager, loginRemoteRepository,
            new CompositeSubscription());
    }

    @Provides
    @LoginActivityScope
    public LoginRemoteRepository providesRemoteRepository(@ActivityContext Context context,
                                                      MainApi mainApi,
                                                      SharedPreferencesManager sharedPreferencesManager){
        return new LoginRemoteRepository(mainApi, sharedPreferencesManager, context.getContentResolver());
    }

    @Provides
    @LoginActivityScope
    public LoginModel provideLoginModel(){
        return new LoginModel();
    }

    @Provides
    @LoginActivityScope
    public TelephonyManager provideTelephonyManager(Context context){
        return (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    }
}
Run Code Online (Sandbox Code Playgroud)

LoginActivity.class:

@EActivity(R.layout.activity_login)
public class LoginActivity {

    @Inject
    LoginViewModel loginViewModel;

    @AfterViews
    void afterViews(){
        AndroidInjection.inject(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*rov 6

如何处理 Dagger 2 错误: “Injector factory was bounds for supertypes of ... 你的意思是为子类型绑定一个注入器工厂吗?”

  1. 假设我们确实有一些 BaseActivity:

    open class BaseActivity : MvpAppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

我们还有一个 ActivityBuilder 模块(它提供 BaseActivity 本身)和一个模块,它提供成功运行 BaseActivity 所需的依赖项。

@Module
abstract class ActivityBuilder {
    @ContributesAndroidInjector(modules = [BaseModule::class])
    abstract fun bindBaseActivity(): BaseActivity
}
Run Code Online (Sandbox Code Playgroud)
  1. 如果我们添加一个像这样的 ChildActivity

    类 ChildActivity : BaseActivity() { }

思考:“嘿,Dagger 2 将满足 BaseActivity 的依赖关系,因为我们正在扩展它,我们将启动并运行 ChildActivity,对吧?”。错误的。我们会得到一个异常“注入器工厂绑定了......的超类型。你的意思是为子类型绑定注入器工厂吗?”

  1. 我们应该怎么做?我们应该让 Dagger 2 明确知道我们的 ChildActivity。

a) 将 AndroidInjection.inject(this) 添加到 ChildActivity onCreate() 方法中:

class ChildActivity : BaseActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
    }
}
Run Code Online (Sandbox Code Playgroud)

b) 将 BaseActivity 的所有子类添加到 ActivityBuilder 模块(提供活动)。请注意,满足 BaseActivity 依赖关系的 BaseModule 也应包含在子类 (ChildActivity) 的 @ContributesAndroidInjector 中

@Module
abstract class ActivityBuilder {
    @ContributesAndroidInjector(modules = [BaseModule::class])
    abstract fun bindBaseActivity(): BaseActivity

    //Adding subclasses
    @ContributesAndroidInjector(modules = [BaseModule::class])
    abstract fun bindChildActivity(): ChildActivity
}
Run Code Online (Sandbox Code Playgroud)


Hen*_*arx 5

只是一个明智的猜测:这可能是因为当您使用 AndroidAnnotations 时,您的 Class 实际上被称为不同(它们在某处添加了下划线)。然后你必须像这样定义绑定(不确定下划线在哪里):

@ContributesAndroidInjector(modules = LoginActivityModule_.class)
@LoginActivityScope
abstract LoginActivity bindLoginActivity();
Run Code Online (Sandbox Code Playgroud)