我正在尝试在 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/