将参数从模块传递到模块

时间:2014-02-12 15:33:52

标签: android dagger

使用Dagger,对于简单的事情来说效果非常好,但是当我将Arguments传递给模块时,我不明白规则。基本上是希望将Application Context传递给provider方法,创建一个需要Context的Volles Request队列。

我像这样创建我的模块:

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);
    }
}

正如你所看到的,我使用了Constructor Injection,看起来我很想念它。无论如何使用@ApplicationContext Annotation来阐明应该注入App Context。但是我得到了这个编译错误:

  

错误:com.app.android.application.modules.RequestQueueModule的provideRequestQueue(android.content.Context)所需的@ com.app.android.annotation.ApplicationContext()/ android.content.Context           错误:com.android.volley.RequestQueue上没有可注入的成员。你想添加一个注射构造函数吗? com.app.and.:::::: com com com com com com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com Com

我花了几个小时解决这个问题。但不能真正看到问题。我也尽量避免使用library = true开关,因为我理解它在编译期间禁用了Graph检查。一些食谱可以更好地理解这一点...

更新:看起来像this SO问题类似于我的。

1 个答案:

答案 0 :(得分:0)

像这样更新RequestModule:

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

这告诉Dagger RequestQueueModule添加到ApplicationContextModule并且可以访问该模块中提供的依赖项。这具有为您提供编译时验证的附加优势。

此语句将创建完整图表:

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

或者,您可以在RequestQueueModule上使用complete = false,但这会将编译时可以捕获的任何错误推送到运行时。