2015-03-31 82 views
3

我正在嘗試新的匕首2,這是我第一次實施它,但我無法使它工作。我想我得到的概念,我理解的例子here匕首2活動注射不工作

我嘗試複製相同的結構,只是修改了我的例子。

這裏是擴展圖形的AppComponent,我定義了我想要的類。

@ApplicationScope 
@Component(modules = {AppModule.class, DataModule.class}) 
public interface EFAppComponent extends EFGraph { 

    /** 
    * An initializer that creates the graph from an application. 
    */ 
    public final static class Initializer { 

     private Initializer() { 
     } // No instances. 

     public static EFAppComponent init(EFApp app) { 
      return Dagger_EFAppComponent.builder() 
        .appModule(new AppModule(app)) 
        .build(); 
     } 
    } 
} 


public interface EFGraph { 

    public void inject(EFApp app); 

    public ImageLoader imageLoader(); 

    public EventBus eventBus(); 

} 

然後在每個模塊中,我提供了相應的類。從這裏一切正常,Dagger接縫正確構建Dagger_EFAppComponent。

然後在應用程序的I類init已使用構造

component = EFAppComponent.Initializer.init(this); 
component.inject(this); 

然後我的目標是注入ImageLoader的和EventBus在我的活動。爲此,我創建一個ActivityComponent。

@ActivityScope 
@Component(
     dependencies = EFAppComponent.class, 
     modules = ActivityModule.class 
) 
public interface ActivityComponent { 

    public void inject(BaseActivity activity); 

} 

然後從我的活動我呼籲注射。

activityComponent = Dagger_ActivityComponent.builder() 
       .eFAppComponent(component) 
       .activityModule(new ActivityModule(this)) 
       .build(); 
activityComponent.inject(this); 

所以,因爲我在應用程序注入注入方法調用之後在我的活動中聲明瞭@Inject EventBus eventBus。那不是。

因此,在逐步調試和跟蹤我的應用程序和示例後,我意識到Dagger_ActivityComponent未正確構建。

private final ActivityModule activityModule; 
    private final EFAppComponent eFAppComponent; 

    private Dagger_ActivityComponent(Builder builder) { 
     assert builder != null; 
     this.activityModule = builder.activityModule; 
     this.eFAppComponent = builder.eFAppComponent; 
     initialize(); 
    } 

如果initialize方法是空的,並且沒有Provider被聲明爲變量。

我錯過了什麼嗎?我一整天都在試圖讓它工作,但我不是成功的。

欣賞幫助。

回答

14

好吧......花了一整天的時間後,我決定發佈它,5分鐘後我找到了解決方案。

我對我的所有活動都使用了BaseActivity,並且我認爲我可以使用它來注入我的組件,但接縫不可行。

所以我只是在我的ActivityComponent改變這一行

public void inject(BaseActivity activity) 

public void inject(MainActivity activity) 

因此,要在那裏我注射的依賴性活動的名稱...

什麼給我帶來了一個新問題。我如何實現一個基礎組件來處理我所有的活動?或者我必須爲每個視圖/活動/片段創建一個組件我想擁有DI?

+0

您應該創建另一個問題,我認爲或修改現有的 – 2015-03-31 13:04:48

+0

我會創建一個新的,所以如果人們面臨同樣的問題,這裏是一個解決方案hehe – Marcel 2015-03-31 13:24:32

+2

在同一個組件'public void inject(SecondActivity activity)'' 。這是由於匕首提供的靜態輸入。 – 2015-03-31 13:33:48

2

@Marcel,我最近將一個項目從Dagger 1.2遷移到2.0。我有類似的解決方案,其中抽象的BaseActivity通過沿着「application.inject(this);」的方式執行某些操作來注入依賴項。在Dagger 2.0中,這是不可能的(截至目前),如上面評論中所述。

我解決這個問題的方法之一是通過改變Application類本身的「inject」方法來強類型化對象。例如..

class MyApp extends Application { 
    ... 
    public void inject(Object activity) { 
    if (activity instanceof MainActivity) { 
     mComponent.inject((MainActivity) activity); 
    } else if (activity instanceof SubActivity) { 
     mComponent.inject((SubActivity) activity); 
    } 
    } 
} 

因此,我不必改變我現有的類中的任何東西。

供參考:@ thomas-broyer有一個名爲Bullet的項目也是這樣做的。