【发布时间】:2020-07-04 11:49:49
【问题描述】:
我是 dagger 和 hilt 的新手,我正在尝试使用 Hilt 使用构建器将我的适配器注入到我的片段中(片段实际上是在片段寻呼机适配器中,因此它和适配器有多个实例) ,似乎设置正确,我在 onCreate 中的 super 之前构建了组件,但是当稍后尝试在片段中访问它时适配器为空,我想知道以后是否需要以某种方式提供它,例如我有我的适配器我的片段
@AndroidEntryPoint
public class CardHolderFragment extends Fragment {
public CardAdapter cardAdapter;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
DaggerCardAdapterComponent.builder()
.cardAdapterDependencies(() -> layoutIdentifier)
.build().inject(this);
super.onCreate(savedInstanceState);
cardAdapter.notifyDataSetChanged(); // CardAdapter.notifyDataSetChanged()' on a null object reference
所以我的问题是,如果组件设置正确,这应该可以工作还是我错过了一个步骤? 我想做的是类似于 cardAdapter = DaggerCardAdapterComponent.getCardAdapter 但我不能在组件中放置提供方法,我查看了匕首迁移指南here 这对我来说有点复杂,因为我只有一个在切换到刀柄之前用匕首几周,但指南提到
最后,如果针对不同的活动或片段组件进行了不同的配置,您可能需要重新设计一些东西。例如,您可以在 Activity 上使用新接口来提供对象。
所以我尝试了这个,这让我实现了接口,然后返回了一个卡适配器,但我不确定我应该在这里返回什么,欢迎任何帮助
这是我的卡适配器组件
@Component(dependencies = CardAdapterDependencies.class, modules = {TypeFactoryModule.class,
ItemTouchListenerModule.class, GlideModule.class})
public interface CardAdapterComponent {
void inject(CardHolderFragment cardHolderFragment);
@Component.Builder
interface Builder {
Builder cardAdapterDependencies(CardAdapterDependencies cardAdapterDependencies);
CardAdapterComponent build();
}
interface HasCardAdapter{
CardAdapter getCardAdapter();
}
}
这是我的卡适配器构造函数
@Inject
public CardAdapter(
ItemTouchListener onItemTouchListener,
String layoutIdentifier,
TypeFactory typeFactory,
RequestManager glide
) {
this.onItemTouchListener = onItemTouchListener;
this.typeFactory = typeFactory;
this.layoutIdentifier = layoutIdentifier;
this.glide = glide;
this.elements = new ArrayList<>();
}
【问题讨论】:
-
适配器应该用
@Inject标记为@Inject public CardAdapter cardAdapter。要使用 hilt,您应该使用@AndroidEntryPoint以及容器活动标记您的片段,然后删除手动组件注入。 (我假设您的模块配置正确) -
我尽快试试这个,让你知道
-
你的
Fragment是androidx.Fragment吗? -
yh 它是一个 androidx.Fragment
-
@Pavneet_Singh 你明白我在这里使用构建器吗?因为它需要运行时参数
标签: android android-fragments dependency-injection dagger-hilt