首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dagger 2.11 [dagger.android.AndroidInjector.inject(T)]发现了依赖周期

Dagger 2.11 [dagger.android.AndroidInjector.inject(T)]发现了依赖周期
EN

Stack Overflow用户
提问于 2017-09-30 06:48:41
回答 1查看 2K关注 0票数 0

我是刚接触过Dagger并学习在android应用程序中实现Dagger 2.11。我遵循了一些教程并创建了一个示例项目。但是我发现了一个错误:

代码语言:javascript
复制
Error:(19, 8) error: [dagger.android.AndroidInjector.inject(T)] Found a dependency cycle:
com.saharan.daggerart.DaggerArtApplication is injected at
com.saharan.daggerart.AppModule.provideApplicationContext(application)
com.saharan.daggerart.DaggerArtApplication is injected at
com.saharan.daggerart.AppModule.provideSharedPreferences(application)
android.content.SharedPreferences is injected at
com.saharan.daggerart.MainActivity.preferences
com.saharan.daggerart.MainActivity is injected at
dagger.android.AndroidInjector.inject(arg0)

AppComponent:

代码语言:javascript
复制
 @Singleton
@Component(modules = {AndroidInjectionModule.class, AppModule.class, ActivityModule.class})
public interface AppComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(Application application);
        AppComponent build();
    }
    void inject(DaggerArtApplication application);
}

AppModule:

代码语言:javascript
复制
@Singleton
@Module(subcomponents = {MainActivityComponent.class})
public class AppModule {

    @Provides
    @Singleton
    DaggerArtApplication provideApplicationContext(DaggerArtApplication application) {
        return application;
    }

    @Provides
    @Singleton
    SharedPreferences provideSharedPreferences(DaggerArtApplication application) {
        return application.getSharedPreferences(Constants.PrefKeys.PREF_NAME, Context.MODE_PRIVATE);
    }
}

ActivityModule:

代码语言:javascript
复制
@Module
public abstract class ActivityModule {
    @Binds
    @IntoMap
    @ActivityKey(MainActivity.class)
    abstract AndroidInjector.Factory<? extends Activity> bindMainActivity(MainActivityComponent.Builder builder);
}

MainActivityComponent:

代码语言:javascript
复制
@Subcomponent(modules = MainActivityModule.class)
public interface MainActivityComponent extends AndroidInjector<MainActivity> {
    @Subcomponent.Builder
    abstract class Builder extends AndroidInjector.Builder<MainActivity> {
    }
}

MainActivityModule:

代码语言:javascript
复制
@Module
public class MainActivityModule {

    @Provides
    String provideUserName() {
        return "Mr. Bond";
    }
}

现在MainActivity:

代码语言:javascript
复制
 public class MainActivity extends AppCompatActivity {

    @Inject String username;
    @Inject
    SharedPreferences preferences;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AndroidInjection.inject(this);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

我做错了什么?救命啊!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-30 16:47:23

看上去像个打字错误。

代码语言:javascript
复制
DaggerArtApplication provideApplicationContext(DaggerArtApplication application)

这意味着Dagger需要一个DaggerArtApplication来提供一个DaggerArtApplication。我想你是想说

代码语言:javascript
复制
DaggerArtApplication provideApplicationContext(Application application)

这会把DaggerArtApplicationApplication结合起来。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46500316

复制
相关文章

相似问题

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