gpt4 book ai didi

java - @Inject 字段的空对象

转载 作者:行者123 更新时间:2023-11-29 20:51:04 25 4
gpt4 key购买 nike

我正在为我的 Android 应用程序遵循 MVC 模式,并且遇到过几次这个问题并且不得不解决它。 当我的应用程序能够使用字段上的@Inject 注释创建注入(inject)对象时,该对象的@Inject 字段为空,通常会导致崩溃。例如,我有 Controller 类将处理逻辑和流动。任何 fragment/Activity 都会回调到它们的 Controller 以通知用户交互/状态更改。但是,注入(inject)的 Controller 实例通常为 null。

我举一个简单的例子来说明。下面, Controller 创建了一个注入(inject)的 Activity ,然后使用它通过添加一个 fragment 来启动流程。该依赖关系已处理,但 Activities 对 Controller 的依赖关系未处理(即 null)。

处理业务逻辑和流程的简单 Controller 类:

public class SomeController {
@Inject
SomeActivity someActivity;

private SomeComponent component;

private final Application app;

@Inject
public SomeController(Application app) {
this.app = app;
}

private void startActivity() {
component = Dagger_SomeComponent().builder()
.someModule(app)
.build();

someActivity.getFragmentManager().beginTransaction().
.add(R.id.content, SomeFragment.class, null)
.commit();
}

public void activityStarted() {
//callback when Activity is ready...
}
}

处理用户交互并回调 Controller 以执行某些业务逻辑的简单 Activity :

public class SomeActivity extends Activity {

@Inject
SomeController controller;

private void controllerCallback() {
//notify controller of something here...
}
}

用于将对象注入(inject)图形的简单模块类:

@Module
public class SomeModule {

private Application app;

public SomeModule(Application app) {
this.app = app;
}

@Provides
@Singleton
SomeController provideSomeController( return new SomeController(app); )

@Provides
SomeActivity provideSomeActivity( return new SomeActivity();)
}

用于提供使用对象的方法的简单组件类:

@Component
public interface SomeComponent {

void addController(SomeController controller);

SomeController controller();

SomeActivity activity();
}

最佳答案

我相信您的示例中遗漏了一些内容:

1)Dagger2组件是一些提供依赖的模块和一些“消耗”依赖的注入(inject)点之间的桥梁。您的组件应该至少有一个链接模块,注释应该如下所示:

@Component(modules = SomeModule.class)

2) 带有“new”运算符的模块中的 SomeActivity 实例化没有任何意义。好的,您可以创建 Activity 对象,但是谁来管理它的状态、调用它的生命周期方法等?如果您真的想将现有 Activity 的引用作为依赖项传递 - 这是可能的,但方式不同。例如,创建应用程序级模块和组件,以及一个单独的 Activity 级模块和组件,将现有 Activity 引用作为模块构造函数参数传递。

3) Activity 是由Android 框架创建的,因此您应该在Activity 中使用字段注入(inject)。在您的组件中添加如下一行:

void inject(SomeActivity activity);

并将创建Component的代码放入Activity中。例如 onCreate():

SomeComponent component = Dagger_SomeComponent().builder()
.someModule(getApplication())
.build()
.inject(this);

4) 请尽量避免在开头使用@Singleton注解。首先确保你声明的所有依赖项都得到满足并且你不再有空值。接下来可以查看一些已有的Dagger2开源项目,做正确的scope annotations。

关于java - @Inject 字段的空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29133675/

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