Android Dagger 2 依赖项未被注入

Android Dagger 2 Dependency not being injected

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

我在存储库中收到空指针异常。他没有被注射。

如果我添加这一行:

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

它有效,但 DI 的意义在于不必担心这个,或者我错了?

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

提前致谢,

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

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

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

在你的组件中:

void inject(BaseActivity);

注入一个有自己的@Inject 字段的子class不会工作:

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

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