Android Dagger 2 Dependency没有被注入

gme*_*rio 4 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();
}
Run Code Online (Sandbox Code Playgroud)

我的模块:

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的AndroidApplication:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的活动:

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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

会发生什么是我在存储库中得到一个空指针异常.他没有被注射.

如果我添加这一行虽然:

repository = ((AndroidApplication) getApplication()).component().dependencyRepository();
Run Code Online (Sandbox Code Playgroud)

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

我已经尝试过其他一些示例和教程,但还没有设法解决我的问题.

提前致谢,

小智 9

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);
    }
} 
Run Code Online (Sandbox Code Playgroud)

在您的组件中:

void inject(BaseActivity);
Run Code Online (Sandbox Code Playgroud)

注入具有它自己的@Inject字段的子类不起作用:

public class ActualActivity extends BaseActivity {
    @Inject IDependenceyRepository repo;
}
Run Code Online (Sandbox Code Playgroud)

这是因为Dagger需要知道将在编译时注入的具体类,而不是运行时(如Dagger 1可以做到的).