Java Dagger 2.10:子组件&x2B;自定义范围=";如果没有@Inject构造函数或@Provides-或@products注释方法,则无法提供;

Java Dagger 2.10:子组件&x2B;自定义范围=";如果没有@Inject构造函数或@Provides-或@products注释方法,则无法提供;,java,android,dagger-2,Java,Android,Dagger 2,为什么下面的代码无法编译并出现以下错误,以及应该如何修复它 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 MainActivi

为什么下面的代码无法编译并出现以下错误,以及应该如何修复它

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

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();
    }
}
@Singleton
@Component
public interface AppComponent {
    void inject(App app);

    SubComponent.Builder subComponent();
}
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);
    }
}
@SubScope
@Subcomponent(modules = {SubModule.class})
public interface SubComponent {
    void inject(MainActivity activity);

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

        SubComponent build();
    }
}
@Module
public class SubModule {
    @Provides
    @SubScope
    public int provideAbc() {
        return 1;
    }
}
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface SubScope {
}
AppComponent.java

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();
    }
}
@Singleton
@Component
public interface AppComponent {
    void inject(App app);

    SubComponent.Builder subComponent();
}
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);
    }
}
@SubScope
@Subcomponent(modules = {SubModule.class})
public interface SubComponent {
    void inject(MainActivity activity);

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

        SubComponent build();
    }
}
@Module
public class SubModule {
    @Provides
    @SubScope
    public int provideAbc() {
        return 1;
    }
}
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface SubScope {
}
MainActivity.java

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();
    }
}
@Singleton
@Component
public interface AppComponent {
    void inject(App app);

    SubComponent.Builder subComponent();
}
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);
    }
}
@SubScope
@Subcomponent(modules = {SubModule.class})
public interface SubComponent {
    void inject(MainActivity activity);

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

        SubComponent build();
    }
}
@Module
public class SubModule {
    @Provides
    @SubScope
    public int provideAbc() {
        return 1;
    }
}
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface SubScope {
}
SubComponent.java

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();
    }
}
@Singleton
@Component
public interface AppComponent {
    void inject(App app);

    SubComponent.Builder subComponent();
}
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);
    }
}
@SubScope
@Subcomponent(modules = {SubModule.class})
public interface SubComponent {
    void inject(MainActivity activity);

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

        SubComponent build();
    }
}
@Module
public class SubModule {
    @Provides
    @SubScope
    public int provideAbc() {
        return 1;
    }
}
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface SubScope {
}
SubModule.java

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();
    }
}
@Singleton
@Component
public interface AppComponent {
    void inject(App app);

    SubComponent.Builder subComponent();
}
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);
    }
}
@SubScope
@Subcomponent(modules = {SubModule.class})
public interface SubComponent {
    void inject(MainActivity activity);

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

        SubComponent build();
    }
}
@Module
public class SubModule {
    @Provides
    @SubScope
    public int provideAbc() {
        return 1;
    }
}
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface SubScope {
}
SubScope.java

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();
    }
}
@Singleton
@Component
public interface AppComponent {
    void inject(App app);

    SubComponent.Builder subComponent();
}
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);
    }
}
@SubScope
@Subcomponent(modules = {SubModule.class})
public interface SubComponent {
    void inject(MainActivity activity);

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

        SubComponent build();
    }
}
@Module
public class SubModule {
    @Provides
    @SubScope
    public int provideAbc() {
        return 1;
    }
}
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface SubScope {
}

为了让它工作,我只需在
子范围中将
@限定符
更改为
@Scope

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface SubScope {
}