Dagger Hilt注入继承MyView的接口实现时presenter未初始化问题
错误根本原因
- 你的
DevicesListFragment没有添加@AndroidEntryPoint注解,Hilt不会为未标记的Android组件执行成员注入,导致btPresenter没有被赋值。 - 你将View绑定的Module安装在了
SingletonComponent中,单例组件生命周期和应用一致,无法感知短生命周期的Fragment实例,也无法正确提供MyView的实现,进一步导致Presenter构造失败。 - 全局绑定MyView只能对应一个实现,无法满足你多个Fragment对应不同MyView子接口实现的需求。
具体解决步骤
- 给所有需要注入Presenter的Fragment添加
@AndroidEntryPoint注解
@AndroidEntryPoint // 注意这里你之前写的DevicesListMyView是笔误,要和你定义的子接口名DevicesListView保持一致 class DevicesListFragment() : Fragment(), DevicesListView { @Inject lateinit var btPresenter: BluetoothPresenter // 其余业务代码 }
- 调整Presenter的作用域,和Fragment生命周期绑定
给BluetoothPresenter添加@FragmentScoped注解,保证同一个Fragment内只会创建一个Presenter实例:
@FragmentScoped class BluetoothPresenter @Inject constructor( @ApplicationContext private val context: Context, private val view: MyView ) { // 其余业务代码 }
- 调整Module的安装范围和绑定逻辑
将Module安装到FragmentComponent中,每个Fragment的Component会自动提供当前Fragment实例作为MyView的实现,完美支持多Fragment对应不同MyView子接口的需求:
@Module @InstallIn(FragmentComponent::class) interface ViewBindModule { @Binds fun bindMyView(fragment: Fragment): MyView }
你之前写的两个绑定方法可以删掉,不需要单独绑定子接口,只要你的Fragment实现了对应的MyView子接口,注入的时候会自动匹配。
改完后运行即可解决lateinit未初始化的报错,同时满足你不同Fragment注入Presenter时传入对应MyView子接口实现的需求。
内容的提问来源于stack exchange,提问作者flopez
相关产品推荐
相关产品推荐

