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(以某种方式)。

  1. 简化您的 ImageHelper(无需字段注入)。是 Singleton 吗?
@Singleton
class ImageHelper {
  public RequestManager glide;

  @Inject
  public ImageHelper(RequestManager glide) {
    this.glide = glide;
  }

  //...
}
  1. 为您创建一个 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();
  }

  //...
}