2017-06-22 34 views
0

我曾經注入當前活動或活動上下文的一些合作者共享注入父活動(BaseActivity或AppCompactActivity)的幾個活動。 但出於某種原因,我無法使用Dagger 2.11 Android Injector。如何使用Dagger注入當前活動的合作者2.11 Android注入器

這是我的活動模塊:

@Module 
public class ActivityModule { 

    private final Activity activity; 
    public ActivityModule(Activity activity) { 
     this.activity = activity; 
    } 

    @Provides 
    @PerActivity 
    ActColaborator provideActCollaborator() { 
     return new ActColaborator(); 
    } 

    @Provides 
    @PerActivity 
    Activity provideActivity() { 
     return activity; 
    } 
} 

我嘗試注入這些類:

@Inject 
    public Navigator(ActColaborator actColaborator, 
        BaseActivity activity) { 
     this.actColaborator = actColaborator; 
     this.activity = activity; 
    } 

但我得到一個

BaseActivity cannot be provided without an @Inject constructor or from an @Provides-annotated method. 

如果我刪除BaseActivity東西,ActColaborator正確注入。 問題是ActivityModule是不再實例化在傳遞活動本身的活動,因爲它使用的是:

//old, pre Android-injector code 
    this.activityComponent = getApplicationComponent() 
      .getActivityComponentBuilder() 
      .activityModule(new ActivityModule(this)) 
      .build(); 

所以我不知道該怎樣做可以注入到其合作者當前活動的想法。

如要求提供更多資訊: 我有三個活動的三個不同的組件類,但所有的人都像這樣:

@PerActivity 
@Subcomponent 
public interface MainActivityComponent extends  AndroidInjector<MainActivity> { 
    @Subcomponent.Builder 
    abstract class Builder extends AndroidInjector.Builder<MainActivity> { 
    } 
} 

而且ActivityBindingModule:

@Module(subcomponents = { 
     MainActivityComponent.class, 
     DetailActivityComponent.class, 
     AnotherActivityComponent.class 
}) 
abstract public class ActivityBindingModule { 
    @Binds 
    @IntoMap 
    @ActivityKey(MainActivity.class) 
    abstract AndroidInjector.Factory<? extends Activity> mainActivityInjectorFactory(
      MainActivityComponent.Builder builder); 
..... 
+0

你能不能也發表您的組件類:

@PerActivity @Subcomponent(modules = { ActivityModule.class, DetailActivityModule.class}) public interface DetailActivityComponent extends AndroidInjector<DetailActivity> { @Subcomponent.Builder abstract class Builder extends AndroidInjector.Builder<DetailActivity> { } } 

最後,我們可以在我們共同的合作者注入當前活動? – azizbekian

+0

進一步調查後添加更多信息。在android之前的注入模式下,活動實例化了ActivityModule,使得將當前活動傳遞給它很容易。使用AndroidInjector這是不可能的,因爲ActivityModule沒有在我的應用程序代碼中實例化。 –

回答

1

好了,終於找到了問題是什麼。 使用具有依賴項或子組件的組件我可以在BaseActivity級別創建ActivityComponent級別,然後使用它將屬性注入頂級活動。

薩爾方式,當我將Activity注入合作者當前使用ActivityComponent持有當前活動。簡單。

Android注入器的問題是我們沒有從代碼中實例化ActivityComponent,它是AndroidInjector誰做的,所以我們需要在它自己的模塊中提供每個活動。

例如主營:

@Module 
public abstract class MainActivityModule { 
    @Provides 
    @PerActivity 
    static Activity provideActivity(MainActivity activity) { 
     return activity; 
    } 
} 

詳細信息:

@Module 
public abstract class DetailActivityModule { 
    @Provides 
    @PerActivity 
    static Activity provideActivity(DetailActivity activity) { 
     return activity; 
    } 
} 

共同提供:

@Module 
public abstract class ActivityModule { 
    @Provides 
    @PerActivity 
    static ActColaborator provideActCollaborator() { 
     return new ActColaborator(); 
    } 
} 

然後,我們聲明它們在主營:

@PerActivity 
@Subcomponent(modules = { ActivityModule.class, MainActivityModule.class}) 
public interface MainActivityComponent extends AndroidInjector<MainActivity> { 
    @Subcomponent.Builder 
    abstract class Builder extends AndroidInjector.Builder<MainActivity> { 
    } 
} 

和細節:

private final Activity activity; 

@Inject 
public Navigator(Activity activity) { 
    this.activity = activity; 
} 
+0

你是否想出了一種簡單地提供'Activity'而不需要綁定'MainActivity'的方法? 即沒有這樣做: static activity provideActivity(MainActivity activity){ return activity; } 我覺得只需要公開活動實例,即匕首-Android的東西已經知道關於某種方式... – Kavi

+0

是的,你可以在BaseActivity中綁定,但是你仍然必須爲每個方法定義注入方法活動組件上的活動。但至少你將只有一個Activity組件用於你的所有活動。看看Github上我的Dagger遊樂場:https://github.com/msesma/DaggerPlayground –

相關問題