代码之家  ›  专栏  ›  技术社区  ›  HelloCW

为什么Hilt创建的ViewModel可以自动使用Android Studio中的应用程序?

  •  0
  • HelloCW  · 技术社区  · 3 年前

    我知道 "A ViewModel must never reference a view, Lifecycle, or any class that may hold a reference to the activity context." ,所以为了使用 Application ,我需要使用 AndroidViewModel 就像代码A一样。

    目前,我在Android Studio项目中使用Hilt作为DI,代码B运行良好,似乎我可以使用 应用 在里面 ViewModel Hilt自动创建的,为什么?

    顺便说一句,似乎 ViewModel 已绑定 应用 基于 article

    代码A

    class RecordSoundViewModel (
        private val appContext: Application,                
    ): AndroidViewModel(appContext) {
        ....
    }
    

    代码B

    @HiltViewModel
    class RecordSoundViewModel @Inject constructor(
        @ApplicationContext val myContext: Context, //Lint: This field leaks a context object
        private val appContext: Application         //It's OK, why doesn't Android Studio display warning information        
    ): ViewModel()
    {
         ...
    }
    
    1 回复  |  直到 3 年前
        1
  •  1
  •   Pawel    3 年前

    Hilt中的一般情况 Application 它本身始终是依赖关系图的一部分,因此您可以在任何地方注入它。它也可以用作 Context

    在第一种情况下,它只是基本的视图模型,我假设您使用默认的视图模型工厂创建。它只支持具有Application和/或SavedStateHandle参数(或无参数)的构造函数。

    至于 @HiltViewModel 有一点字节码操作发生在引擎盖下,它取代了 ViewModel 工厂,让您满意 @Inject 构造函数。 你是通过使用 by viewModels() 在标记为 @AndroidEntryPoint

        2
  •  1
  •   ΓDΛ    3 年前

    因为当您第一次运行您正在使用的应用程序时 @HiltAndroidApp 在Application类中。

    所有使用Hilt的应用程序都必须包含一个用注释的应用程序类 @HiltAndroidApp .@HiltAndroidApp启动了 Hilt组件,还为应用程序生成基类 使用那些生成的组件。因为代码生成 需要访问所有模块,编译您的 应用程序类还需要在其 可传递依赖关系。

    当检查源代码时,可以清楚地看到 @应用程序上下文 是单例。它为您提供了从任何您想要的地方访问的权限,并方便了它的创建。

    Dagger Hilt Application Context Provides

    推荐文章