Hilt 的其它对象注入到普通类和普通类( @Inject constructor)注入到其它类(Activity或Fragment)

100% 可以!!!

普通类(不是 ViewModel)完全能用 Hilt 依赖注入!

我给你用最简单、最确定的话讲清楚:


一、结论(超级重要)

不管是不是 ViewModel不管是不是 Activity不管是不是 Fragment只要是个类,都能用 @Inject 注入!

kotlin

kotlin 复制代码
// 普通类,不是 ViewModel → 照样可以注入!
class TravelManager @Inject constructor(
    private val mApiService: Api,
    private val gson: Gson
) {
    // 随便用
}

✅ 完全支持 ✅


二、那 ViewModel 和普通类的区别是什么?

1. 普通类

只需要在**构造函数上加 @Inject**别的什么都不用加!

kotlin

kotlin 复制代码
class 普通类 @Inject constructor(
    private val api: Api,
    private val gson: Gson
)

2. ViewModel 类

必须加 **@HiltViewModel**因为它是特殊的生命周期类

kotlin

less 复制代码
@HiltViewModel
class ViewModel类 @Inject constructor(
    private val api: Api
) : ViewModel()

三、普通类注入后,怎么用?

方式 1:在别的被注入的类里直接用(最常用)

kotlin

kotlin 复制代码
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    // 直接注入普通类(TravelManager支持注入必须写@Inject constructor())
    @Inject
    lateinit var travelManager: TravelManager
}

方式 2:在 ViewModel 里用

kotlin

less 复制代码
@HiltViewModel
class MyViewModel @Inject constructor(
    private val travelManager: TravelManager // 普通类直接注入
) : ViewModel()

四、Hilt 会自动创建普通类吗?

会!!!

你写:

kotlin

kotlin 复制代码
class A @Inject constructor()
class B @Inject constructor()

class C @Inject constructor(
    val a: A,
    val b: B
)

Hilt 会自动创建 A → 自动创建 B → 自动传给 C你完全不用管!

五、你现在的代码改成普通类,完全正确

kotlin

kotlin 复制代码
// 普通类,不是 ViewModel
class TravelManager @Inject constructor(
    private val mApiService: Api,
    private val gson: Gson
) {
    // 正常写逻辑
}

✅ 能运行✅ 能注入✅ 能使用

六、超级总结(背会)

  1. 普通类 + @Inject 构造函数 = 支持注入
  2. ViewModel + @HiltViewModel + @Inject = 支持注入
  3. Activity/Fragment + @AndroidEntryPoint = 支持注入
  4. 所有类都能被 Hilt 管理
  5. 不需要继承任何类!

七、普通类被别人注入(重点)

这种类,想让 Hilt 注入,只需要加一个注解: @Inject constructor()

kotlin

kotlin 复制代码
class TravelManager @Inject constructor()

就这一步,完事。

2. 然后你在 Activity 里就能直接用

kotlin

kotlin 复制代码
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    @Inject
    lateinit var travelManager: TravelManager
}

✅ 直接运行,不会报错

✅ 不需要 Module

✅ 不需要 @Provides

✅ 不需要继承任何东西

3. 为什么可以?

Hilt 看到:

  • TravelManager 构造是 @Inject
  • 没有参数→ Hilt 直接帮你 new 一个实例 注入进去。

4. 超级精简总结

  • 空类 class A→ 加 @Inject constructor()→ 就能被 @Inject 到处用

5. 完整最小示例(复制就能跑)

kotlin

kotlin 复制代码
// 普通空类,加个 @Inject 构造
class TravelManager @Inject constructor() {
    fun sayHi() = "我是被 Hilt 注入的!"
}

kotlin

kotlin 复制代码
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    @Inject lateinit var travelManager: TravelManager

    override fun onCreate(...) {
        super.onCreate(...)
        println(travelManager.sayHi())
    }
}

八、什么时候用 @Inject 构造,什么时候必须写 Module @Provides?

1、 什么时候用:@Inject constructor()

适用场景
  • 你自己写的类
  • 构造方法里的参数,Hilt 能找到(要么也是 @Inject,要么有 @Provides)
  • 不需要复杂配置、不需要 builder 模式、不需要动态参数
写法

kotlin

kotlin 复制代码
class TravelManager @Inject constructor(
    private val api: Api,
    private val gson: Gson
)
一句话判断

这个类是我写的,我能改它的构造 → 用 @Inject 构造!

2、 什么时候必须用:@Module + @Provides

适用场景(满足任意一条就必须用)
  1. 类不是你写的(第三方库:OkHttp、Retrofit、Gson、Glide、Room...)
  2. 构造方法私有 ,你不能直接 new
  3. 需要复杂构建(builder 模式、拦截器、配置、证书)
  4. 需要动态传参(Context、BuildConfig、URL 等)
  5. 接口 / 抽象类(无法直接实例化)
写法

kotlin

less 复制代码
@Module
@InstallIn(SingletonComponent::class)
object NetModule {

    // 第三方类 → 必须 Provides
    @Provides
    fun provideGson(): Gson {
        return GsonBuilder()
            .setLenient()
            .create()
    }
}
一句话判断

这个类我改不了源码 / 要复杂配置 → 必须写 @Provides!

九、 终极口诀(背会这 2 句就永远不会错)

  1. 自己写的类 → 加 @Inject constructor()
  2. 别人写的类 / 需要配置 → 写 @Module + @Provides

一张表彻底分清

表格

情况 用啥 示例
自己写的普通类 @Inject constructor() class UserManager @Inject constructor()
自己写的类,需要 Api @Inject constructor(api: Api) 自动注入
Gson / OkHttp / Retrofit @Provides 第三方,必须手动构建
接口(Api Service) @Provides retrofit.create(api::class.java)
需要 Context 的类 @Provides provideContext(application)

回到你最开始的代码,完美对应

kotlin

kotlin 复制代码
// 自己写的 → @Inject 构造
class TravelManager @Inject constructor(
    private val api: Api,    // 来自 Provides
    private val gson: Gson   // 来自 Provides
)

// 第三方 → 必须 Provides
@Module
object NetModule {
    @Provides fun provideApi...
    @Provides fun provideGson...
}
相关推荐
我命由我123451 天前
Android 开发中,关于 Gradle 的 distributionUrl 的一些问题
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
撩得Android一次心动1 天前
Android DataBinding 全面解析【源码篇1】
android·android jetpack·databinding
阿巴斯甜2 天前
Android中Hilt 的使用:
android jetpack
阿巴斯甜2 天前
Android 中InitializationProvider的使用:
android jetpack
阿巴斯甜3 天前
Android Compose中使用官方自带的PullToRefreshBox
android jetpack
我命由我123453 天前
Android Jetpack Compose - ModalNavigationDrawer、NavigationRail、PullToRefreshBox
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
我命由我123453 天前
Android buildSrc 模块问题:Gradle 的类 DefaultProject 被错误地尝试转换成 Apache Ant 的 Project 类
android·java·java-ee·kotlin·android jetpack·android-studio·android runtime
阿巴斯甜4 天前
Compose中 Saver的使用:
android jetpack
我命由我123454 天前
Android Jetpack Compose - SearchBar(搜索栏)、Tab(标签页)、时间选择器、TooltipBox(工具提示)
android·java·java-ee·kotlin·android studio·android jetpack·android-studio