如何使用Dagger2子组件?

3
根据官方文档:https://google.github.io/dagger/subcomponents.html,我在@Module中添加了一个子组件,代码如下:
@Module(subcomponents = {MainActivityComponent.class})
public class ContextModule {

    private Context mContext;

    public ContextModule(Context context) {
        mContext = context;
    }

    @Provides
    public Context provideContext() {
        return mContext;
    }

}

并且像这样声明我的组件和子组件:
@Component(modules = ContextModule.class)
public interface AppComponent {
    Context provideContext();

    MainActivityComponent getMainActivityComponent();
}

@Subcomponent(modules = {HardwareModule.class, SoftwareModule.class})
public interface MainActivityComponent {
    void injectMainActivity(MainActivity activity);
}

但是代码无法成功编译。错误信息如下:
Error:(11, 1) : com.kilnn.dagger2.example.MainActivityComponent doesn't have a @Subcomponent.Builder, which is required when used with @Module.subcomponents

我不知道如何编写@Subcomponent.Builder,如果我在@Module中删除子组件声明,则一切正常。因此,我不知道如何正确使用子组件。

1个回答

1
实际上,错误信息已经很详细了,你只需要像这样将Builder添加到你的Subcomponent中即可:

MainActivityComponent.class

@Subcomponent.Builder
interface Builder {
     MainActivityComponent build();
}

针对您当前的实现,由于您没有特殊的依赖项,您并不真正需要Subcomponent

注意:出于惯例考虑,建议您将Subcomponent重命名为MainActivitySubcomponent


虽然已经很久了,我也知道如何使用,但仍需感谢您的回答。将其重命名为“MainActivitySubcomponent”是一个好主意。 - Kilnn
我不可能知道:)我只是尝试帮助。 - Joaquim Ley
抱歉打扰老问题,但是@Joaquim Ley为什么要写这样的话:“对于您当前的实现,并且由于您没有特殊的依赖关系,您实际上不需要Subcomponent。”我看到MainActivityComponent被重命名为MainActivitySubcomponent,并且有两个AppComponent没有的模块。 - Heroes84

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接