gpt4 book ai didi

java - 未在 Android Dagger 项目中注入(inject)字段

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:20:53 26 4
gpt4 key购买 nike

我正在 Android 上玩 Dagger。我创建了一个模型 UserPreference、一个名为 PreferenceModule 的模块和另一个类 UserPreferenceTest,它是 PreferenceModule 的测试。我有以下 3 个 java 文件

UserPreference.java

package com.sigicn.preference;

import javax.inject.Inject;

import com.sigicn.commonmodels.Application;

public class UserPreference {
public String name, weiboAccount;

@Inject
public Application[] frequentlyUsedApps;
}

然后是 PreferenceModule.java

package com.sigicn.preference;

import javax.inject.Singleton;

import com.sigicn.commonmodels.Application;
import com.sigicn.utils.MiscUtils;

import dagger.Module;
import dagger.Provides;

@Module(library = true, complete = true)
public class PreferenceModule {

@Provides @Singleton UserPreference provideUserPreference() {
UserPreference userPreference = new UserPreference();
userPreference.frequentlyUsedApps = provideApplications();
return userPreference;
}

@Provides @Singleton Application[] provideApplications() {
return new Application[]{
new Application(
MiscUtils.generateUUID(), "Youtube"),
new Application(
MiscUtils.generateUUID(), "Pixi")
};
}

}

然后是UserPreferenceTest.java

package com.sigicn.test.preference;

import javax.inject.Inject;

import com.sigicn.preference.PreferenceModule;
import com.sigicn.preference.UserPreference;

import dagger.Module;
import dagger.ObjectGraph;
import android.test.AndroidTestCase;

public class UserPreferenceTest extends AndroidTestCase {
@Module(injects = {UserPreference.class, UserPreferenceTest.class},
includes = PreferenceModule.class)
static class TestModule {
}

ObjectGraph objectGraph;

@Inject
UserPreference userPreference;

@Override
protected void setUp() throws Exception {
if (objectGraph == null) {
objectGraph = ObjectGraph.create(new TestModule());
}
super.setUp();
}

public void testFrequentlyUsedApps()
{
UserPreference localUserPreference = objectGraph.get(UserPreference.class);
assertNotNull(localUserPreference);
assertEquals(localUserPreference.frequentlyUsedApps.length, 2);

objectGraph.inject(this);
assertNotNull(userPreference);
assertEquals(userPreference.frequentlyUsedApps.length, 2);
assertSame(localUserPreference, userPreference);
assertSame(localUserPreference.frequentlyUsedApps, userPreference.frequentlyUsedApps);
}
}

但不知道为什么,UserPreferencefrequentlyUsedApps 没有按预期注入(inject)。知道为什么吗?

更新:

我想我已经找到原因了。这是因为我手动创建了 UserPreference 并在提供程序中使用它。如果我删除 UserPreference 的 Provider,并让 Dagger 自动连接它,那么字段 frequentlyUsedApps 就会被注入(inject)。所以,我没有很好地理解 Dagger 是我的错。

最佳答案

我认为您需要添加一些 ObjectGraph#inject 调用。

在每个有 @Inject 注释的类中,您还需要调用您创建的 ObjectGraph 的注入(inject)方法。

我也为此苦苦挣扎了一段时间。我认为基本模式是:

  1. 注释您的字段以表明您想要注入(inject)它们
  2. 创建一个模块来“提供”那些@Injects 的实例
  3. 在某处创建图表(似乎大多数人都在这样做应用程序类)
  4. 在你想从你的模块中注入(inject)东西的类中,得到一个图的实例并调用 inject(this)。

我开始使用单例而不是 Application 类,因为至少现在我有一些地方想注入(inject)应用程序本身。

所以这就是我目前正在做的,它似乎工作得很好

public class Injector {

private static Injector mInjector;
private ObjectGraph mObjectGraph;
private MyApp mApp;

private Injector() {

}

public static Injector getInstance() {
if (mInjector == null) {
mInjector = new Injector();
}
return mInjector;
}

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

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

public ObjectGraph getObjectGraph() {
return mObjectGraph;
}

public void initialize(MyApp app) {
mApp = app;
mObjectGraph = ObjectGraph.create(getModules().toArray());
System.out.println(String.format("init object graph = %s",mObjectGraph.toString()));

}

}

然后在我的应用程序类中,我有一个这样的构造函数:

public MyApp() {
System.out.println("myapp construtor");
Injector.getInstance().initialize(this);
Injector.getInstance().inject(this);

}

然后当我想注入(inject)一些东西时我会这样做

@Inject Bus mBus;

public GcmBroadcastReceiver() {
Injector.getInstance().inject(this);

}

我有两个模块,一个用于生产,一个用于测试

生产的有这个

@Provides @Singleton
public Bus provideBus () {
return BusProvider.getInstance();
}

测试的有这个

@Provides @Singleton
public Bus provideBus () {
return mock(Bus.class);
}

关于java - 未在 Android Dagger 项目中注入(inject)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25361454/

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