You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dagger Hilt注入继承MyView的接口实现时presenter未初始化问题

错误根本原因

  1. 你的DevicesListFragment没有添加@AndroidEntryPoint注解,Hilt不会为未标记的Android组件执行成员注入,导致btPresenter没有被赋值。
  2. 你将View绑定的Module安装在了SingletonComponent中,单例组件生命周期和应用一致,无法感知短生命周期的Fragment实例,也无法正确提供MyView的实现,进一步导致Presenter构造失败。
  3. 全局绑定MyView只能对应一个实现,无法满足你多个Fragment对应不同MyView子接口实现的需求。

具体解决步骤

  1. 给所有需要注入Presenter的Fragment添加@AndroidEntryPoint注解
@AndroidEntryPoint
// 注意这里你之前写的DevicesListMyView是笔误,要和你定义的子接口名DevicesListView保持一致
class DevicesListFragment() : Fragment(), DevicesListView { 
    @Inject
    lateinit var btPresenter: BluetoothPresenter
    // 其余业务代码
}
  1. 调整Presenter的作用域,和Fragment生命周期绑定
    给BluetoothPresenter添加@FragmentScoped注解,保证同一个Fragment内只会创建一个Presenter实例:
@FragmentScoped
class BluetoothPresenter @Inject constructor(
    @ApplicationContext private val context: Context,
    private val view: MyView
) {
    // 其余业务代码
}
  1. 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:45:04