使用@AndroidEntryPoint标注DialogFragment报错无法注入ViewModel怎么解决
解决方案
1. 报错@AndroidEntryPoint base class must extend ...的修复
- 优先检查
DialogFragment的导入包:必须使用AndroidX 库下的 DialogFragment,导入路径为androidx.fragment.app.DialogFragment,禁止使用旧版系统原生的android.app.DialogFragment,Hilt 不支持原生旧版 Fragment 体系组件。 - 升级 Hilt 版本到 2.35 及以上稳定版,低版本 Hilt 未默认支持 DialogFragment 添加
@AndroidEntryPoint注解。 - 确认项目的 Application 类已经添加
@HiltAndroidApp注解,且 Hilt 相关依赖已完整引入到工程的build.gradle配置中。
2. ViewModel 注入实现
首先给你的 ViewModel 类添加 Hilt 专用注解:
@HiltViewModel public class MyViewModel extends ViewModel { // 构造方法添加@Inject注解让Hilt完成注入 @Inject public MyViewModel() { // 你的ViewModel初始化逻辑 } }
3. 父Fragment代码修复
原代码调用了旧版系统 FragmentManager,改为适配 AndroidX 体系的实现:
@AndroidEntryPoint public class HomeFragment extends Fragment { private FragmentHomeBinding mBinding; public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mBinding = FragmentHomeBinding.inflate(inflater, container, false); mBinding.startBtn.setOnClickListener(v -> { MyFragmentFragment dialog = MyFragmentFragment.newInstance(); dialog.setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Theme_Learn365_NoActionBar); // 若需要和HomeFragment共享ViewModel作用域,使用getChildFragmentManager dialog.show(getChildFragmentManager(), "MyFragment"); }); return mBinding.getRoot(); } }
4. DialogFragment代码优化
@AndroidEntryPoint public class MyFragmentFragment extends DialogFragment implements View.OnClickListener { private FragmentBuycourseBinding mBinding; private MyViewModel myViewModel; public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_buycourse, container, false); // 若需要独立作用域ViewModel,传this即可 myViewModel = new ViewModelProvider(this).get(MyViewModel.class); // 若需要和父HomeFragment共享数据,改为如下初始化方式: // myViewModel = new ViewModelProvider(requireParentFragment()).get(MyViewModel.class); // 绑定生命周期,让DataBinding可以观察LiveData变化 mBinding.setLifecycleOwner(this); mBinding.setViewModel(myViewModel); initViews(); return mBinding.getRoot(); } public static MyFragmentFragment newInstance(){ return new MyFragmentFragment(); } // 省略initViews、onClick方法实现 }
内容的提问来源于stack exchange,提问作者Amritesh Kumar
相关产品推荐
相关产品推荐

