Hilt 依赖注入,在提供的模块内滑动模块
Hilt dependency injection, glide module inside a provided module
我是 hilt and dagger 的新手,我不知道我的做法是否有误,或者它是否因其他原因不起作用,所以请多多包涵。
我想将依赖于另一个 class 的 class 注入视图持有者 class。
view holder extends BaseViewHolder,我想注入的class是一个依赖于glide的图像助手class。
我有一个提供滑行的模块
@Module
@InstallIn(ApplicationComponent.class)
public class GlideModule {
@Provides
public static RequestManager provideGlideRequestManager(@ApplicationContext Context context) {
return Glide.with(context);
}
}
这个模块在我的应用程序的其他地方使用,所以我知道它有效。
我已经用 @Inject 注释了图像助手构造函数,我正在尝试像这样 class 现场注入滑行
@Inject
public RequestManager glide;
@Inject
public ImageHelper() {
}
然后在我的视图持有者中,我用 @Inject
注释了图像助手
@Inject
public ImageHelper imageHelper;
public SentenceViewHolder(View view, ItemTouchListener onItemTouchListener, OnStartDragListener mDragStartListener) {
super(view);
this.v = view;
findViewIds(onItemTouchListener, mDragStartListener);
}
在我的 findViewIds 方法中,我尝试访问图像助手,但它为空,
所以我试着为它构建一个模块,但并不愉快
@Module
@InstallIn(ActivityComponent.class)
public class ImageHelperModule {
@Singleton
@Provides
public ImageHelper provideImageHelper() {
return new ImageHelper();
}
}
感谢任何帮助
仅向字段添加 @Inject
注释不足以让 Hilt 提供它。您还需要定义一个 EntryPoint
(以某种方式)。
- 简化您的
ImageHelper
(无需字段注入)。是 Singleton
吗?
@Singleton
class ImageHelper {
public RequestManager glide;
@Inject
public ImageHelper(RequestManager glide) {
this.glide = glide;
}
//...
}
- 为您创建一个
EntryPoint
ViewHolder
并在 ViewHolder's
构造函数中使用它
public class SentenceViewHolder extends ViewHolder {
@EntryPoint
@InstallIn(ViewComponent.class)
interface SentenceViewHolderEntryPoint {
public ImageHelper imageHelper();
}
private ImageHelper imageHelper;
public SentenceViewHolder(View view, ItemTouchListener onItemTouchListener, OnStartDragListener mDragStartListener) {
super(view);
resolveDependency(view);
this.v = view;
findViewIds(onItemTouchListener, mDragStartListener);
}
private void resolveDependency(View view) {
SentenceViewHolderEntryPoint hiltEntryPoint = EntryPointAccessors.fromView(view, SentenceViewHolderEntryPoint.class);
imageHelper = hiltEntryPoint.imageHelper();
}
//...
}
我是 hilt and dagger 的新手,我不知道我的做法是否有误,或者它是否因其他原因不起作用,所以请多多包涵。
我想将依赖于另一个 class 的 class 注入视图持有者 class。
view holder extends BaseViewHolder,我想注入的class是一个依赖于glide的图像助手class。
我有一个提供滑行的模块
@Module
@InstallIn(ApplicationComponent.class)
public class GlideModule {
@Provides
public static RequestManager provideGlideRequestManager(@ApplicationContext Context context) {
return Glide.with(context);
}
}
这个模块在我的应用程序的其他地方使用,所以我知道它有效。
我已经用 @Inject 注释了图像助手构造函数,我正在尝试像这样 class 现场注入滑行
@Inject
public RequestManager glide;
@Inject
public ImageHelper() {
}
然后在我的视图持有者中,我用 @Inject
注释了图像助手@Inject
public ImageHelper imageHelper;
public SentenceViewHolder(View view, ItemTouchListener onItemTouchListener, OnStartDragListener mDragStartListener) {
super(view);
this.v = view;
findViewIds(onItemTouchListener, mDragStartListener);
}
在我的 findViewIds 方法中,我尝试访问图像助手,但它为空,
所以我试着为它构建一个模块,但并不愉快
@Module
@InstallIn(ActivityComponent.class)
public class ImageHelperModule {
@Singleton
@Provides
public ImageHelper provideImageHelper() {
return new ImageHelper();
}
}
感谢任何帮助
仅向字段添加 @Inject
注释不足以让 Hilt 提供它。您还需要定义一个 EntryPoint
(以某种方式)。
- 简化您的
ImageHelper
(无需字段注入)。是Singleton
吗?
@Singleton
class ImageHelper {
public RequestManager glide;
@Inject
public ImageHelper(RequestManager glide) {
this.glide = glide;
}
//...
}
- 为您创建一个
EntryPoint
ViewHolder
并在ViewHolder's
构造函数中使用它
public class SentenceViewHolder extends ViewHolder {
@EntryPoint
@InstallIn(ViewComponent.class)
interface SentenceViewHolderEntryPoint {
public ImageHelper imageHelper();
}
private ImageHelper imageHelper;
public SentenceViewHolder(View view, ItemTouchListener onItemTouchListener, OnStartDragListener mDragStartListener) {
super(view);
resolveDependency(view);
this.v = view;
findViewIds(onItemTouchListener, mDragStartListener);
}
private void resolveDependency(View view) {
SentenceViewHolderEntryPoint hiltEntryPoint = EntryPointAccessors.fromView(view, SentenceViewHolderEntryPoint.class);
imageHelper = hiltEntryPoint.imageHelper();
}
//...
}