2014-02-12 39 views
1

使用Dagger,對於簡單的事情來說工作起來相當不錯,但當我將參數傳遞給模塊時,我不理解規則。基本上是想要將應用程序上下文傳遞給提供者方法,並創建需要上下文的Volles請求隊列。將參數從模塊傳遞到模塊

創建我的模塊是這樣的:

public static Object[] getModules(@ApplicationContext final Context appContext) 
{ 
    return new Object[]{new ApplicationContextModule(appContext),new ReleaseModules()}; 
} 

應用程序上下文模塊:

@Module(library = true, includes = RequestQueueModule.class) 
public final class ApplicationContextModule 
{ 
    private final Context applicationContext; 

    public ApplicationContextModule(final Context aContext) 
    { 
    Preconditions.checkNotNull(aContext, "Application Context"); 
    // 
    applicationContext = aContext; 
    } 

    @ApplicationContext 
    @Provides 
    //@Singleton 
    public Context provideApplicationContext() 
    { 
    return applicationContext; 
    } 
} 

RequestQueueModule:

@Module(injects = {AutoCacheService.class, ServiceListFragment.class}) 
public class RequestQueueModule 
{ 

    //private final Context context; 

    //@Inject 
    public RequestQueueModule() 
    { 
    //context = theContext; 
    } 

    @Singleton 
    @Provides 
    public com.android.volley.RequestQueue provideRequestQueue(@ApplicationContext final Context context) 
    { 
    return Volley.newRequestQueue(context); 
    } 
} 

正如你可以看到我打了一下與構造器注入,看起來我很想理解這第一個。無論如何,使用@ApplicationContext Annotation來澄清App Context應該被注入。但我得到這個編譯錯誤:

error: @com.app.android.annotation.ApplicationContext()/android.content.Context required by provideRequestQueue(android.content.Context) for com.app.android.application.modules.RequestQueueModule error: No injectable members on com.android.volley.RequestQueue. Do you want to add an injectable constructor? required by com.app.android.io.service.AutoCacheService for com.app.android.application.modules.ReleaseModules

我花了幾個小時這個問題。但不能真正看到問題。如果可能,我也儘量避免使用library = true開關,因爲我理解它會在編譯期間禁用Graph檢查。一些食譜會很好理解這個更好...

更新:看起來像this SO問題是類似於我的。

+0

你應該在'RequestQueueModule'上設置'complete = false'(可能'library = true')。這有幫助嗎? –

回答

0

更新RequestModule這樣的:

@Module(injects = {AutoCacheService.class, ServiceListFragment.class}, addsTo = ApplicationContextModule.class) 
public class RequestQueueModule 
{ 
} 

這是告訴匕首RequestQueueModule添加到ApplicationContextModule並訪問該模塊中提供的依賴。這具有給你編譯時驗證的附加優點。

該語句將創建全圖:

ObjectGraph graph = ObjectGraph.create(new ApplicationContextModule(), new RequestQueueModule()) 

或者,也可以對RequestQueueModule complete = false,但是這將推動在編譯時被捕獲,而不是運行時的任何錯誤。