繁体   English   中英

Android Dagger 2 Dependency没有被注入

[英]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;
    }
}

我的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;
    }
}

这是我的活动:

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) )。

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

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

在您的组件中:

void inject(BaseActivity);

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM