gpt4 book ai didi

java - Dagger 的依赖注入(inject)被忽略,字段保持为空

转载 作者:行者123 更新时间:2023-12-02 04:29:22 25 4
gpt4 key购买 nike

我有 2 个模块:AndroidModule 用于提供 Context 相关对象,PhotosModule 提供 PhotoManager

我想在 PhotosFragment 中使用 PhotoManagerPhotoManager 依赖于 DbManager,它由 AndroidModule 提供。

如何连接所有点?

代码可以编译,但此行会抛出 NPE:

mDbManager.readDatabase();

这意味着即使我设置了 DbManagerPhotoManager 的注入(inject)也没有发生

injects = PhotoManager.class

AndroidModule中。

此外,mDbManager 不是私有(private)字段,因此我认为我不必在 PhotoManager 的构造函数上使用注入(inject);现场注入(inject)应该足够了。

原因是什么以及如何满足缺少的依赖关系?我认为我的代码可能存在多个问题。注意:我刚刚开始使用 Dagger,请记住这一点。

应用:

public class TestApp extends Application {

private ObjectGraph mObjectGraph;

@Override
public void onCreate() {
super.onCreate();
mObjectGraph = ObjectGraph.create(getModules().toArray());
}

protected List<Object> getModules() {
return Arrays.asList(new AndroidModule(this), new PhotosModule());
}

public void inject(Object object) {
mObjectGraph.inject(object);
}
}

Android模块:

@Module(library = true, injects = PhotoManager.class)
public class AndroidModule {

private final TestApp mApplication;

public AndroidModule(TestApp application) {
mApplication = application;
}

@Provides
@Singleton
@ForApplication
Context provideApplicationContext() {
return mApplication;
}

@Provides
@Singleton
DbManager provideDbManager() {
return new DbManager(mApplication);
}
}

照片模块:

@Module(injects = PhotosFragment.class)
public class PhotosModule {

@Provides
@Singleton
PhotoManager providePhotoManager() {
return new PhotoManager();
}
}

照片管理器:

@Singleton
public class PhotoManager {

@Inject
DbManager mDbManager;

public void doSomething() {
mDbManager.readDatabase();
}
}

照片 fragment :

public class PhotosFragment extends Fragment {

@Inject
PhotoManager mPhotoManager;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((TestApp) getActivity().getApplication()).inject(this);
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
///...
mPhotoManager.doSomething();
}
}

数据库管理器:

@Singleton
public class DbManager {

public DbManager(Context context) {
//...
}

public void readDatabase() {
//...
}
}

最佳答案

这是问题的核心:在 PhotosModule 中,您有提供程序方法:

PhotoManager providePhotoManager() {
return new PhotoManager();
}

您正在自己新建PhotoManager,因此Dagger 没有机会注入(inject)其依赖项(DbManager)。

我认为这是因为您误解了 AndroidModule< 的 @Module(injects=...) 注释上的 injects 属性的含义。你有:

@Module(library = true, injects = PhotoManager.class)

但是不需要 injects,因为您永远不会在 PhotoManager 上调用 objectGraph.inject。相反,您只注入(inject) PhotoFragment,这是正确的...

解决 NPE 问题的一种方法是:

  1. AndroidModule.java 中删除 injects=PhotoManager.class:

    @Module(library = true)
  2. 更改 PhotosModule 以包含 AndroidModule:

    @Module(injects = PhotosFragment.class, includes = AndroidModule.class)
  3. 我使用 @Inject 注释避免字段注入(inject)(仅将其用于顶级对象,即执行 objectgraph.inject 的位置,例如 Activity 和 fragment 级别),并对所有其他依赖项使用构造函数注入(inject)。因此,我将更改 PhotoManager 以注入(inject) DbManager,如下所示:

    private final DbManager mDbManager;

    public PhotoManager(DbManager dbManager) {
    mDbManager = dbManager;
    }

我已经输入了代码here on GitHub .

关于java - Dagger 的依赖注入(inject)被忽略,字段保持为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31687648/

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