Hilt在Fragment的onAttach中因Preconditions.checkNotNull抛出空指针异常
解决Hilt Fragment空指针异常的方案
问题原因
你的空指针异常出现在Hilt初始化Fragment组件上下文的阶段,核心原因是在MyFragment的onAttach方法中,你将自定义包装的LanguageContextWrapper直接传递给了super.onAttach(),干扰了Hilt内部对原始Context的处理流程,导致Hilt创建组件上下文时触发空指针校验失败。
修复步骤
1. 修改onAttach方法,恢复Hilt的原始Context处理逻辑
不要在onAttach中替换传递给父类的Context,让Hilt先完成组件初始化:
abstract public class MyFragment extends Fragment { @Override public void onAttach(@NonNull Context context) { // 直接调用父类方法,传递原始Context,让Hilt完成组件初始化 super.onAttach(context); // 无需手动保存context,使用Fragment自带的getContext()/requireContext()即可 } }
2. 通过重写getContext()提供语言包装后的Context
在MyFragment中重写getContext()和requireContext(),确保所有依赖Context的地方都能拿到正确的语言包装实例:
abstract public class MyFragment extends Fragment { @Override public void onAttach(@NonNull Context context) { super.onAttach(context); } @Nullable @Override public Context getContext() { Context originalContext = super.getContext(); if (originalContext == null) { return null; } String preferLanguage = LanguageContextWrapper.getUserPreferLanguage(originalContext); // 确保LanguageContextWrapper.create不会返回null return LanguageContextWrapper.create(originalContext, preferLanguage); } @NonNull @Override public Context requireContext() { Context context = getContext(); if (context == null) { throw new IllegalStateException("Fragment " + this + " 未关联到Context"); } return context; } }
3. 额外检查
确保LanguageContextWrapper.create()方法不会返回null,如果该方法存在返回null的情况,需要补充逻辑保证返回有效的Context实例,避免后续出现空指针。
内容的提问来源于stack exchange,提问作者Slava
相关产品推荐
相关产品推荐

