gpt4 book ai didi

java - 未注入(inject) Android Dagger 2 依赖项

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:44 25 4
gpt4 key购买 nike

我正在尝试在我的应用程序中使用 Dagger 2,但我在实体存储库方面遇到了一些问题,我还没有弄清楚我缺少什么。

这是我的应用程序组件:

@Singleton
@Component(
modules = {
AndroidModule.class,
RepositoryModule.class
}
)

public interface ApplicationComponent {
void inject(AndroidApplication app);
IDependenceyRepository dependencyRepository();
}

我的模块:

@Module
public class RepositoryModule {
@Provides @Singleton IDependenceyRepository provideDependendencyRepository(Context context) {
return new DependencyRepository(context);
}
}

@Module
public class AndroidModule {
private final AndroidApplication app;

public AndroidModule(AndroidApplication app) {
this.app = app;
}

@Provides @Singleton Context provideApplicationContext() {
return app;
}
}

我的 Android 应用程序:

public class AndroidApplication extends Application {
private ApplicationComponent component;

@Override
public void onCreate() {
super.onCreate();
setupGraph();
}

private void setupGraph() {
component = DaggerApplicationComponent.builder()
.androidModule(new AndroidModule(this))
.repositoryModule(new RepositoryModule())
.build();
component.inject(this);
}

public ApplicationComponent component() {
return component;
}
}

这是我的 Activity :

public class MainActivity extends Activity {
@Inject
IDependenceyRepository repository;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.testRepository();
}

private void testRepository() {
Dependency dep = new Dependency();
dep.setDescription("XXX");
dep.setName("AAAA");

try {
repository.save(dep);
Log.d("", repository.queryAll().get(0).getName());
} catch (SQLException e) {
e.printStackTrace();
}
}

发生的事情是我在存储库中收到一个空指针异常。他没有被注入(inject)。

如果我添加这一行:

repository = ((AndroidApplication) getApplication()).component().dependencyRepository();

它有效,但 DI 的重点不是不必担心这个,或者我错了?

我尝试了一些其他示例和教程,但未能解决我的问题。

提前致谢

最佳答案

david.mihola 的评论是正确的:为了能够初始化 @Inject 字段,您需要在组件中有一个方法(通常是 void inject(MyClass))。

值得注意的是(不是专门针对你的问题,但它可能会出现)如果你有一个基类:

public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((AndroidApplication) getApplication()).component().inject(this);
}
}

在你的组件中:

void inject(BaseActivity);

注入(inject)到具有自己的@Inject 字段的子类不会工作:

public class ActualActivity extends BaseActivity {
@Inject IDependenceyRepository repo;
}

这是因为 Dagger 需要知道将在编译时注入(inject)的具体类,而不是运行时(就像 Dagger 1 可以做的那样)。

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

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