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

标签 java android dependency-injection dagger dagger-2

我正在尝试在我的应用程序中使用 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/

相关文章:

java - 创建事务管理器 bean 时出错

java - 'delete' 中函数 'SQLiteDataBase' 的文档中的错误

java - 如何用java编写自己的比较器类?

java - 从android中的非 Activity 类调用 Activity 的方法

dependency-injection - 没有 ASP.NET Core 的 .NET Core 中的 DI

java - 如何更改默认自定义对话框的边框颜色?

android - 重绘 Canvas ,用于更新然后在其上设置文本不起作用

java - Sqlite 和 Window 已经聚焦

c# - 如何在 ASP MVC 5 中将 MediatR 与 Autofac 一起使用?

java - 使用 Spring 连接不在列表中实现标记接口(interface)的 bean