公开 Android 库中定义的 Dagger 组件

Exposing Dagger Components defined in an Android Library

一个 gradle 模块中的 Android 应用程序如何包含另一个 Android 库 (.aar) 中定义的 dagger @Modules?

我正在尝试拥有一个通用库,它提供一组通过 dagger @Module 定义的功能,能够将它们注入到依赖于该库的应用程序中

@Singleton
@Component(modules = {
        AndroidSupportInjectionModule.class,
        LibraryAppModule.class
})
public interface LibraryComponent extends AndroidInjector<DaggerApplication> {
    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(Application application);
        LibraryComponent build();
    }

    void inject(LibraryApplication app);

    @Override
    void inject(DaggerApplication instance);
}
@Module
public class LibraryAppModule {

    @Provides
    @Singleton
    Context provideContext(Application application) {
        return application;
    }

    @Singleton
    @Provides
    ServiceFoo provideServiceFoo(Context context) {
        return new ServiceFoo(context);
    }

    @Singleton
    @Provides
    ServiceBar provideServiceBar(Context context, ServiceFoo serviceFoo) {
        return new ServiceBar(context, serviceFoo);
    }

}

现在在依赖此库的应用程序中 (build.gradle) 我尝试了以下操作:

implementation project(":Library")

使用库的应用程序

@Singleton
@Component(modules = {
        AndroidSupportInjectionModule.class,
        LibraryAppModule.class
})
public interface ExampleApplicationComponent extends AndroidInjector<DaggerApplication> {

    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(Application application);
        ExampleApplicationComponent build();
    }

    void inject(ExampleApplication app);

    @Override
    void inject(DaggerApplication instance);
}

这是我遇到问题的地方的示例(空对象)。这是一个独立的模块,依赖于库。

public class MainActivity extends AppCompatActivity {

    @Inject
    ServiceFoo serviceFoo;

    @Inject
    ServiceBar serviceBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        serviceFoo.downloadImages();

        serviceBar.uploadImages();
    }
}

我希望看到 LibraryAppModule 的服务在我使用 @Inject 的活动中可用。我做错了什么?

想要将 属性 注入其中的 class 应该调用 inject()!

因为你想在 MainActivity 中注入 serviceFoo,你应该从 onCreate() 调用 inject()。但是,inject() 定义在哪里让你调用它?因此,您在 ExampleApplicationComponent.

中另外声明 inject()

综上所述,看来你对匕首的理解还不全面。推荐this博客post.

要解决此问题,需要完成 2 件事。

  1. MainActivity 必须扩展 DaggerAppCompatActivity(这确保在 onCreate() 期间我们的 Activity 调用了 inject(),但为了它在那里工作Activity.
  2. 需要 AndroidInjector
  3. 这是通过在我定义并安装到 ExampleApplicationComponent
  4. 的模块中使用 @ContributesAndroidInjector 来完成的
@Module
public abstract class ExampleApplicationActivityBuilder {

    @ContributesAndroidInjector
    abstract MainActivity bindMainActivity();
}

现在在 MainActivity 中,我要从库模块注入的服务是非空的。

这是一个 git 提交,显示了实施此修复的不同之处。 https://github.com/PeregrineFalcon/DaggerExampleLibrary/commit/1ebfdecfa3684c7ac124b9f6a4cecd23712a74fd

希望这对尝试使用库提供的 @Modules 进行多模块 Dagger Android 项目的其他人有所帮助。