使用 Dagger 2 注入数据绑定适配器
Inject into Databinding Adapter with Dagger 2
我正在使用 Android 数据绑定适配器,它说,它必须是静态的。所以我试图使它成为非静态的,并按照 this tutorial 使用 Dagger 将我的 classes 注入其中。虽然我可以在应用程序中正常使用 dagger 提供的 Picasso
实例,但它显示 Picasso cannot be provided without an @Inject constructor or an @Provides-annotated method
.
我将 @Inject 注释添加到我的绑定适配器构造函数,但仍然出现相同的错误
public class ImageBindingAdapter {
private final Picasso picasso;
@Inject
public ImageBindingAdapter(Picasso picasso) {
this.picasso = picasso;
}
@BindingAdapter("android:src")
public void loadImage(ImageView view, String url) {
picasso.load(url).fit().into(view);
}
}
我认为该问题可能与 component
问题有关,因此改变了我的方法并遵循 this link 并使用 subcomponent
。但是这次 dagger 不能生成子组件,我不能像例子中那样设置它
// Build dagger binding subcomponent and set it like default databinding component
DataBindingUtil.setDefaultComponent(sApplicationComponent
.daggerBindingComponentBuilder()
.build());
如何将我的自定义 classes 注入到带有 Dagger 的绑定适配器中,感谢任何帮助
这是我的匕首classes,和我上面提到的教程差不多
ImageBindingAdapter Class
public class ImageBindingAdapter {
private final Picasso picasso;
@Inject
public ImageBindingAdapter(Picasso picasso) {
this.picasso = picasso;
}
@BindingAdapter("android:src")
public void loadImage(ImageView view, String url) {
picasso.load(url).fit().into(view);
}
}
绑定模块class
@Module
public class BindingModule {
@Provides
@DataBinding
ImageBindingAdapter provideImageBindingAdapter(Picasso picasso) {
return new ImageBindingAdapter(picasso);
}
}
绑定组件class
@DataBinding
@Component(dependencies = AppComponent.class, modules = BindingModule.class)
public interface BindingComponent extends DataBindingComponent {
}
App组件class
@Singleton
@Component(modules = {AndroidSupportInjectionModule.class, AppModule.class, ...})
public interface AppComponent extends AndroidInjector<MyApp> {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
@Override
void inject(MyApp instance);
}
AppModule class
@Module
public class AppModule {
@Singleton
@Provides
Picasso picasso(Application application, OkHttp3Downloader okHttp3Downloader) {
return new Picasso.Builder(app.getApplicationContext())
.downloader(okHttp3Downloader)
.indicatorsEnabled(true)
.build();
}
....
}
申请class
public class MyApp extends DaggerApplication {
@Override
protected AndroidInjector<MyApp> applicationInjector() {
AppComponent appComponent = DaggerAppComponent.builder().application(this).build();
appComponent.inject(this);
BindingComponent bindingComponent = DaggerBindingComponent.builder()
.appComponent(appComponent)
.build();
DataBindingUtil.setDefaultComponent(bindingComponent);
return appComponent;
}
}
如错误所述,匕首无法解析 Picasso
依赖项。在您的情况下,问题在于不同的匕首组件只能直接使用那些依赖项,即使用方法声明的标有 @Component
注释的接口。要允许 AppComponent
与 BindingComponent
共享 Picasso
,您需要像这样修改应用程序组件:
@Singleton
@Component(modules = {AndroidSupportInjectionModule.class, AppModule.class, ...})
public interface AppComponent extends AndroidInjector<MyApp> {
...
Picasso getPicasso();
}
之后 dagger 可以正确解决 Picasso
依赖关系,错误应该会消失。
@BindingAdapter 应该是 public static void
,参见 Binding adapters docs。
我正在使用 Android 数据绑定适配器,它说,它必须是静态的。所以我试图使它成为非静态的,并按照 this tutorial 使用 Dagger 将我的 classes 注入其中。虽然我可以在应用程序中正常使用 dagger 提供的 Picasso
实例,但它显示 Picasso cannot be provided without an @Inject constructor or an @Provides-annotated method
.
我将 @Inject 注释添加到我的绑定适配器构造函数,但仍然出现相同的错误
public class ImageBindingAdapter {
private final Picasso picasso;
@Inject
public ImageBindingAdapter(Picasso picasso) {
this.picasso = picasso;
}
@BindingAdapter("android:src")
public void loadImage(ImageView view, String url) {
picasso.load(url).fit().into(view);
}
}
我认为该问题可能与 component
问题有关,因此改变了我的方法并遵循 this link 并使用 subcomponent
。但是这次 dagger 不能生成子组件,我不能像例子中那样设置它
// Build dagger binding subcomponent and set it like default databinding component
DataBindingUtil.setDefaultComponent(sApplicationComponent
.daggerBindingComponentBuilder()
.build());
如何将我的自定义 classes 注入到带有 Dagger 的绑定适配器中,感谢任何帮助
这是我的匕首classes,和我上面提到的教程差不多
ImageBindingAdapter Class
public class ImageBindingAdapter {
private final Picasso picasso;
@Inject
public ImageBindingAdapter(Picasso picasso) {
this.picasso = picasso;
}
@BindingAdapter("android:src")
public void loadImage(ImageView view, String url) {
picasso.load(url).fit().into(view);
}
}
绑定模块class
@Module
public class BindingModule {
@Provides
@DataBinding
ImageBindingAdapter provideImageBindingAdapter(Picasso picasso) {
return new ImageBindingAdapter(picasso);
}
}
绑定组件class
@DataBinding
@Component(dependencies = AppComponent.class, modules = BindingModule.class)
public interface BindingComponent extends DataBindingComponent {
}
App组件class
@Singleton
@Component(modules = {AndroidSupportInjectionModule.class, AppModule.class, ...})
public interface AppComponent extends AndroidInjector<MyApp> {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
@Override
void inject(MyApp instance);
}
AppModule class
@Module
public class AppModule {
@Singleton
@Provides
Picasso picasso(Application application, OkHttp3Downloader okHttp3Downloader) {
return new Picasso.Builder(app.getApplicationContext())
.downloader(okHttp3Downloader)
.indicatorsEnabled(true)
.build();
}
....
}
申请class
public class MyApp extends DaggerApplication {
@Override
protected AndroidInjector<MyApp> applicationInjector() {
AppComponent appComponent = DaggerAppComponent.builder().application(this).build();
appComponent.inject(this);
BindingComponent bindingComponent = DaggerBindingComponent.builder()
.appComponent(appComponent)
.build();
DataBindingUtil.setDefaultComponent(bindingComponent);
return appComponent;
}
}
如错误所述,匕首无法解析 Picasso
依赖项。在您的情况下,问题在于不同的匕首组件只能直接使用那些依赖项,即使用方法声明的标有 @Component
注释的接口。要允许 AppComponent
与 BindingComponent
共享 Picasso
,您需要像这样修改应用程序组件:
@Singleton
@Component(modules = {AndroidSupportInjectionModule.class, AppModule.class, ...})
public interface AppComponent extends AndroidInjector<MyApp> {
...
Picasso getPicasso();
}
之后 dagger 可以正确解决 Picasso
依赖关系,错误应该会消失。
@BindingAdapter 应该是 public static void
,参见 Binding adapters docs。