首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dagger 2.10:子组件+自定义作用域=“如果没有@Inject构造函数或来自@Provides或@Produces-注释的方法,就不能提供”

Dagger 2.10:子组件+自定义作用域=“如果没有@Inject构造函数或来自@Provides或@Produces-注释的方法,就不能提供”
EN

Stack Overflow用户
提问于 2017-05-21 14:35:23
回答 1查看 609关注 0票数 1

为什么下面的代码无法用下面的错误进行编译,应该做些什么来修复它呢?

代码语言:javascript
复制
Error:(9, 8) error: [SubComponent.inject(MainActivity)] java.lang.Integer cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method.
java.lang.Integer is injected at
MainActivity.abc
MainActivity is injected at
SubComponent.inject(activity)

TL;DR:我正在尝试创建一个与父组件具有不同作用域的子组件,并将子组件的依赖项注入到活动中。

App.java

代码语言:javascript
复制
public class App extends Application {
    private AppComponent appComponent;

    @Override
    public void onCreate() {
        super.onCreate();
        appComponent = DaggerAppComponent.create();
        appComponent.inject(this);
        if (BuildConfig.DEBUG) {
            Timber.plant(new Timber.DebugTree());
        }
    }

    public AppComponent getAppComponent() {
        return appComponent;
    }

    public static App app(Context context) {
        return (App) context.getApplicationContext();
    }
}

AppComponent.java

代码语言:javascript
复制
@Singleton
@Component
public interface AppComponent {
    void inject(App app);

    SubComponent.Builder subComponent();
}

MainActivity.java

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {
    @Inject
    int abc;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        App.app(this).getAppComponent()
                .subComponent()
                .userModule(new SubModule())
                .build()
                .inject(this);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity);
    }
}

SubComponent.java

代码语言:javascript
复制
@SubScope
@Subcomponent(modules = {SubModule.class})
public interface SubComponent {
    void inject(MainActivity activity);

    @Subcomponent.Builder
    interface Builder {
        Builder userModule(SubModule module);

        SubComponent build();
    }
}

SubModule.java

代码语言:javascript
复制
@Module
public class SubModule {
    @Provides
    @SubScope
    public int provideAbc() {
        return 1;
    }
}

SubScope.java

代码语言:javascript
复制
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface SubScope {
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-21 15:47:26

为了使其工作,我只需将@Qualifier更改为@Scope in SubScope

代码语言:javascript
复制
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface SubScope {
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44098095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档