gpt4 book ai didi

java - 如果没有 @Inject 构造函数,则无法提供 Dagger 2 对象

转载 作者:太空宇宙 更新时间:2023-11-04 11:10:53 25 4
gpt4 key购买 nike

我对 Dagger 2 还很陌生,我有以下类(class)。

我有 2 个模块:

DaoSessionModule

@Module
public class DaoSessionModule {

private DaoSession daoSession;
private Context context;

public DaoSessionModule(Context context) {
this.context = context;
if(daoSession == null) {
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this.context, "my_pocket");
Database db = helper.getWritableDb();
daoSession = new DaoMaster(db).newSession();
}
}

@Provides
LanguageDao providesLanguageDao() {
return daoSession.getLanguageDao();
}

@Provides
CategoryDao providesCategoryDao() {
return daoSession.getCategoryDao();
}

}

GlobalPrefModule

@Module
public class GlobalPrefModule {

private GlobalPref globalPerf;

public GlobalPrefModule(GlobalPref globalPerf) {
this.globalPerf = globalPerf;
}

@Provides
public GlobalPref providesGlobalPref() {
return this.globalPerf;
}

}

及其组件如下:

@Singleton
@Component(modules = {DaoSessionModule.class})
public interface DaoSessionComponent {
void inject(SplashActivity activity);
}

@Singleton
@Component(modules = {GlobalPrefModule.class })
public interface GlobalPrefComponent {
void inject(SplashActivity activity);
}

我在我的应用程序类中构建了两者:

daoSessionComponent = DaggerDaoSessionComponent.builder()
.daoSessionModule(new DaoSessionModule(this))
.build();

globalPrefComponent = DaggerGlobalPrefComponent.builder()
.globalPrefModule(new GlobalPrefModule(new GlobalPref()))
.build();

并将它们注入(inject)到我的启动 Activity 中:

public class SplashActivity extends BaseActivity {

@Inject
LanguageDao languageDao;

@Inject
GlobalPref globalPerf;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initInjections();

}

private void initInjections() {
ZoopiApplication.app().getDaoSessionComponent().injectDao(this);
ZoopiApplication.app().getGlobalPrefComponent().injectGlobalPref(this);
}
}

现在我面临的问题是,如果我只在启动画面中注入(inject) DaoSession 并注释掉 GlobalPref impl,它就会简单地工作,但是当我将 GlobalPref 与 Daosession 一起添加时,它无法构建并给出以下错误消息:

Error:(8, 52) error: cannot find symbol class DaggerDaoSessionComponent
Error:(9, 52) error: cannot find symbol class DaggerGlobalPrefComponent

Error:(16, 10) error: mypocket.com.zoopi.GlobalPref cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method.
mypocket.com.zoopi.GlobalPref is injected at
mypocket.com.zoopi.activities.SplashActivity.globalPerf
mypocket.com.zoopi.activities.SplashActivity is injected at
mypocket.com.zoopi.dagger.dagger2.components.DaoSessionComponent.injectDao(activity)

Error:(16, 10) error: mypocket.com.zoopi.models.LanguageDao cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method.
mypocket.com.zoopi.models.LanguageDao is injected at
mypocket.com.zoopi.activities.SplashActivity.languageDao
mypocket.com.zoopi.activities.SplashActivity is injected at
mypocket.com.zoopi.dagger.dagger2.components.GlobalPrefComponent.injectGlobalPref(activity)

生成的类 DaggerDaoSessionComponentDaggerGlobalPrefComponent 均在构建文件夹中生成。

我无法将两个对象注入(inject)同一个 Activity 中可能是什么原因?

最佳答案

注入(inject)必须从一个组件完成,并且只能从一个组件完成。

应该很容易看到错误消息指出无法提供的对象是您尝试由其他组件注入(inject)的对象。

Dagger 不会进行“一半”注入(inject),并且一个组件必须注入(inject)所有字段。如果可以进行部分注入(inject),则最终可能会出现不一致的状态,因为 Dagger 无法知道如何、何时或在何处注入(inject)其余字段。简而言之,这是不可能的。您必须使用单个组件。

but then I'll have many more modules soon and I don't know if it's a good idea to have one component to handle all modules...

没关系。您最终将得到相当多的模块和可能的相当多的组件,具体取决于您的设置。确保在适当的情况下使用子组件,如果您有分散在多个模块中的大型依赖项组,您甚至可以让模块包含其他模块。

关于java - 如果没有 @Inject 构造函数,则无法提供 Dagger 2 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46010428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com