java - Android dagger 2.11 中的 BroadcastReceiver

标签 java android dependency-injection broadcastreceiver dagger-2

我正在尝试在 android 中使用 dagger 注入(inject)广播接收器。我正在使用 Dagger 2.11。我有 BroadcastReceiver 模块类、组件类,并在 Application 类中实现 HasBroadcastReceiverInjector 。我是否必须在 Application 类中实现 HasBroadcastReceiverInjector,或者我可以在 Activity 类中实现 HasBroadcastReceiverInjector 。有没有人成功用 Dagger 注入(inject)BroadcastReceiver,或者有人知道我做错了什么

这是我的 BroadcastReceiver 模块类

@Subcomponent(modules = LikeBroadcastReceiverModule.class)
public interface LikeBroadcastReceiverComponent extends AndroidInjector<LikeBroadcaseReceiver> {

@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder<LikeBroadcaseReceiver>{}}

这是我的 BroadcastReceiver 模块类

@Module
public class LikeBroadcastReceiverModule {

@Provides
public LikeBroadcastReceiverView provideBroadcastView(LikeBroadcaseReceiver likeBroadcaseReceiver){
    return likeBroadcaseReceiver;
}

@Provides
public BroadcastReceiverPresenter providePresenter(){
    return new BroadcastReceiverPresenterImpl();
}}

这是我的应用程序类

public class EasyDriveApplication extends Application implements HasActivityInjector, HasBroadcastReceiverInjector{

@Inject
DispatchingAndroidInjector<Activity> activityDispatchingAndroidInjector;

@Inject
DispatchingAndroidInjector<BroadcastReceiver> broadcastReceiverDispatchingAndroidInjector;

@Override
public void onCreate() {
    super.onCreate();
    //Fabric.with(this, new Crashlytics());
    DaggerAppComponent.builder().application(this).build().inject(this);
}

@Override
public AndroidInjector<Activity> activityInjector() {
    return activityDispatchingAndroidInjector;
}

@Override
public AndroidInjector<BroadcastReceiver> broadcastReceiverInjector() {
    return broadcastReceiverDispatchingAndroidInjector;
}}

这是我的 AppComponent 类

@Singleton
@Component(modules = {
    AndroidInjectionModule.class,
    AppModule.class,
    DaoModule.class,
    MapperModule.class,
    UseCaseModule.class,
    ThreadingModule.class,
    UtilsModule.class,
    BroadcastReceiverBuilder.class,
    ActivityBuilder.class
    })
public interface AppComponent {

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

void inject(EasyDriveApplication app);}

我的 BroadcastReceiverBuilder 类看起来像

@Module
public abstract class BroadcastReceiverBuilder {

@Binds
@IntoMap
@BroadcastReceiverKey(LikeBroadcaseReceiver.class)
abstract AndroidInjector.Factory<? extends BroadcastReceiver> bindLikeBroadcastReceiver(LikeBroadcastReceiverComponent.Builder builder);}

这是我收到的错误

Error:(46, 10) error: com.presentation.dagger.broadcastReceiver.LikeBroadcastReceiverComponent.Builder cannot be provided without an @Provides-annotated method. com.presentation.dagger.broadcastReceiver.LikeBroadcastReceiverComponent.Builder is injected at com.presentation.dagger.application.module.BroadcastReceiverBuilder.bindLikeBroadcastReceiver(builder) java.util.Map,javax.inject.Provider>> is injected at dagger.android.DispatchingAndroidInjector.(injectorFactories) dagger.android.DispatchingAndroidInjector is injected at com.presentation.dagger.application.EasyDriveApplication.broadcastReceiverDispatchingAndroidInjector com.presentation.dagger.application.EasyDriveApplication is injected at com.presentation.dagger.application.AppComponent.inject(app)

最佳答案

我在尝试找到一种将依赖注入(inject)到 BroadcastReceiver 的方法时发现了此页面,对于遇到问题的其他人来说,这里是如何做到这一点

@Provides
fun providesBlah() : Blah = Blah()

class BlahBroadcastReceiver : BroadcastReceiver() {

@Inject
lateinit var blah: Blah

override fun onReceive(context: Context, intent: Intent) {
    (context.applicationContext as MyApplication).component().inject(this)
}

}

关于java - Android dagger 2.11 中的 BroadcastReceiver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47895175/

相关文章:

java - 使用 Guice 在所有对象中注入(inject)实例

android - 如何根据上下文使用不同的实现注入(inject)相同的 Dagger 2 依赖项?

.net - MEF 和 N 层域驱动设计架构的正确解耦

android - 适用于 Android 的 GCM(Google Cloud Messaging),在 .Net 中编写第 3 方服务器

Android - 如何在以编程方式隐藏软按钮后取消隐藏它们?

android - 如何通过代码在 AlertDialog 上单击 'OK'?

java - JBoss 突然抛出错误

java - 如何使用 Java 中的 MyCanvas 创建动态更新的 GUI?

java - 我在控制台中没有输出 - java - Eclipse

java - 使用 DropWizard 提供数据库配置详细信息而不使用 config.yml?