Dagger 2 和 Android 数据绑定适配器:没有 @Inject 或 @Provides 就无法提供
Dagger 2 and Android Databinding Adapter: cannot be provided without an @Inject or @Provides
我正在使用 Android 的数据绑定库和 Dagger 2。我想利用 DatabingAdapter 在 RecyclerView 中显示我的图像。我使用 Dagger 创建了我的 Picasso 实例,我必须将它注入到我创建的 DatabindingAdapter 中。我按照本教程 here 进行操作,但收到错误消息,指出如果没有 @Inject 或 @Provides 注释方法,则无法提供 Picasso。这是我的代码(类 被简化以更多地关注这个问题,我之前已经让 Picasso 工作了)。
AppModule.java
@Module(includes = {AndroidInjectionModule.class, NetworkModule.class, ViewModelModule.class})
public class AppModule {
@Provides
@AppScope
Picasso picasso(App app, OkHttp3Downloader okHttp3Downloader) {
return new Picasso.Builder(app.getApplicationContext())
.downloader(okHttp3Downloader)
.indicatorsEnabled(true)
.build();
}
}
BindingModule.java
@Module
public class BindingModule {
@BindingScope
@Provides
ImageBindingAdapter provideImageBindingAdapter(Picasso picasso) {
return new ImageBindingAdapter(picasso);
}
}
BindingComponent.java
@BindingScope
@Component(dependencies = AppComponent.class, modules = BindingModule.class)
public interface BindingComponent extends androidx.databinding.DataBindingComponent {
}
AppComponent.java
@AppScope
@Component(modules = {AppModule.class, AndroidSupportInjectionModule.class, ActivityBuildersModule.class})
public interface AppComponent {
void inject(App app);
@Component.Builder
interface Builder {
@BindsInstance
Builder application(App application);
AppComponent build();
}
}
ImageBindingAdapter.java
public class ImageBindingAdapter {
private final Picasso picasso;
public ImageBindingAdapter(Picasso picasso) {
this.picasso = picasso;
}
@BindingAdapter(value = "url")
public void loadImageUrl(ImageView imageView, String url) {
if (url != null && !url.trim().isEmpty())
picasso.load(Constants.ENDPOINT + url).into(imageView);
}
}
这是错误所在。
error: [Dagger/MissingBinding] com.squareup.picasso.Picasso cannot be provided without an @Inject constructor or an @Provides-annotated method.
com.squareup.picasso.Picasso is injected at
com.ralphevmanzano.themoviedb.di.modules.BindingModule.provideImageBindingAdapter(picasso)
com.ralphevmanzano.themoviedb.databinding.ImageBindingAdapter is provided at
androidx.databinding.DataBindingComponent.getImageBindingAdapter()
非常感谢任何帮助。
您的 ImageBindingAdapter
class
中缺少 @Inject
注释
@AppScope
public class ImageBindingAdapter {
private final Picasso picasso;
@Inject
public ImageBindingAdapter(Picasso picasso) {
this.picasso = picasso;
}
@BindingAdapter(value = "url")
public void loadImageUrl(ImageView imageView, String url) {
if (url != null && !url.trim().isEmpty())
picasso.load(Constants.ENDPOINT + url).into(imageView);
}
}
Adding @Inject
tell dagger to add this class to graph, 然后你可以将你的范围注释添加到你的 class 来告诉这个 class 在哪个范围已添加。
ps :您可以删除 BindingModule
class
我正在使用 Android 的数据绑定库和 Dagger 2。我想利用 DatabingAdapter 在 RecyclerView 中显示我的图像。我使用 Dagger 创建了我的 Picasso 实例,我必须将它注入到我创建的 DatabindingAdapter 中。我按照本教程 here 进行操作,但收到错误消息,指出如果没有 @Inject 或 @Provides 注释方法,则无法提供 Picasso。这是我的代码(类 被简化以更多地关注这个问题,我之前已经让 Picasso 工作了)。
AppModule.java
@Module(includes = {AndroidInjectionModule.class, NetworkModule.class, ViewModelModule.class})
public class AppModule {
@Provides
@AppScope
Picasso picasso(App app, OkHttp3Downloader okHttp3Downloader) {
return new Picasso.Builder(app.getApplicationContext())
.downloader(okHttp3Downloader)
.indicatorsEnabled(true)
.build();
}
}
BindingModule.java
@Module
public class BindingModule {
@BindingScope
@Provides
ImageBindingAdapter provideImageBindingAdapter(Picasso picasso) {
return new ImageBindingAdapter(picasso);
}
}
BindingComponent.java
@BindingScope
@Component(dependencies = AppComponent.class, modules = BindingModule.class)
public interface BindingComponent extends androidx.databinding.DataBindingComponent {
}
AppComponent.java
@AppScope
@Component(modules = {AppModule.class, AndroidSupportInjectionModule.class, ActivityBuildersModule.class})
public interface AppComponent {
void inject(App app);
@Component.Builder
interface Builder {
@BindsInstance
Builder application(App application);
AppComponent build();
}
}
ImageBindingAdapter.java
public class ImageBindingAdapter {
private final Picasso picasso;
public ImageBindingAdapter(Picasso picasso) {
this.picasso = picasso;
}
@BindingAdapter(value = "url")
public void loadImageUrl(ImageView imageView, String url) {
if (url != null && !url.trim().isEmpty())
picasso.load(Constants.ENDPOINT + url).into(imageView);
}
}
这是错误所在。
error: [Dagger/MissingBinding] com.squareup.picasso.Picasso cannot be provided without an @Inject constructor or an @Provides-annotated method.
com.squareup.picasso.Picasso is injected at
com.ralphevmanzano.themoviedb.di.modules.BindingModule.provideImageBindingAdapter(picasso)
com.ralphevmanzano.themoviedb.databinding.ImageBindingAdapter is provided at
androidx.databinding.DataBindingComponent.getImageBindingAdapter()
非常感谢任何帮助。
您的 ImageBindingAdapter
class
@Inject
注释
@AppScope
public class ImageBindingAdapter {
private final Picasso picasso;
@Inject
public ImageBindingAdapter(Picasso picasso) {
this.picasso = picasso;
}
@BindingAdapter(value = "url")
public void loadImageUrl(ImageView imageView, String url) {
if (url != null && !url.trim().isEmpty())
picasso.load(Constants.ENDPOINT + url).into(imageView);
}
}
Adding @Inject
tell dagger to add this class to graph, 然后你可以将你的范围注释添加到你的 class 来告诉这个 class 在哪个范围已添加。
ps :您可以删除 BindingModule
class