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 {
}