首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android Hilt dagger接口在viewModel @viewModel中注入获取UninitializedPropertyAccessException

Android Hilt是一个依赖注入框架,它简化了在Android应用中使用依赖注入的过程。它是Google推荐的依赖注入框架,基于Dagger实现。

Dagger是一个Java和Android的依赖注入框架,它通过生成代码的方式来实现依赖注入。而Hilt是在Dagger的基础上进行了封装和简化,使得在Android应用中使用依赖注入更加方便。

在Android中,ViewModel是用于存储和管理与UI相关的数据的类。通过在ViewModel中使用依赖注入,我们可以方便地获取所需的依赖对象,而不需要手动创建和管理它们。

在使用Hilt进行依赖注入时,我们可以使用@ViewModelInject注解来标记需要注入的ViewModel。例如:

代码语言:txt
复制
class MyViewModel @ViewModelInject constructor(private val myRepository: MyRepository) : ViewModel() {
    // ViewModel的代码
}

在上面的代码中,MyViewModel类使用了@ViewModelInject注解来标记构造函数,以便Hilt可以自动注入MyRepository对象。

然而,当我们在ViewModel中使用Hilt进行依赖注入时,有时会遇到UninitializedPropertyAccessException异常。这是因为在ViewModel的构造函数中使用了依赖注入,但是在ViewModel被创建时,依赖对象可能还没有被完全初始化。

为了解决这个问题,我们可以使用@Inject注解来标记需要注入的属性,并使用lateinit关键字来延迟初始化。例如:

代码语言:txt
复制
class MyViewModel @ViewModelInject constructor() : ViewModel() {
    @Inject
    lateinit var myRepository: MyRepository

    // ViewModel的代码
}

在上面的代码中,我们将myRepository属性标记为@Inject,并使用lateinit关键字来延迟初始化。这样,在ViewModel被创建时,myRepository属性会被设置为一个未初始化的状态,直到依赖对象被完全初始化后才会被赋值。

需要注意的是,使用lateinit关键字延迟初始化的属性必须是可空类型或者非基本数据类型。

推荐的腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android Hilt实战初体验: Dagger替换成Hilt

Hilt 为了防止没听说过的小伙伴们一头雾水,首先我们来了解下Hilt是什么? HiltAndroid的依赖注入库,可减少项目中执行手动依赖项注入的样板代码。...Hilt通过为项目中的每个 Android 类提供容器并自动管理其生命周期,提供了一种应用中使用 DI(依赖项注入)的标准方法。...HiltDagger的主要目标都是一致的: 简化 Android 应用的 Dagger 相关基础架构。 创建一组标准的组件和作用域,以简化设置、提高可读性以及应用之间共享代码。...目的是告知模块用在哪个Android。 @Binds @Binds注释会告知Hilt需要提供接口的实例时要使用哪种实现。...我们不要忘了它的本质,它是Dagger之上建立的,本质是为了帮助我们减少不必要的样板模板,方便开发者更好的使用依赖注入Hilt,上面的实现会自动帮我们生成,所以才会使用起来这么简单。

1.6K20

Android--Hilt入门

、构造函数注入Dagger相同,Hilt也分两种注入方式,以上篇Dagger的代码为例子,来对比两个框架的使用区别 1.gradle配置依赖 工程gradle中导入插件: dependencies..."com.google.dagger:hilt-android-compiler:$hilt_version" } 2.使用@Inject注解定义需要注入的类 /** * 模拟本地数据源 */ class...#super() 视图销毁时 ViewWithFragmentComponent View#super() 视图销毁时 2.预定义的Scope Hilt定义的子组件作用域dagger.hilt.android.scopes...@Zhao var userInfo2: UserInfo2 ) : ViewModel() 结果: I/aruba_log: 赵四 四、接口注入 当我们有一个接口,并且有它的实现类,那么Hilt也可以注入生成该接口...定义的组件都绑定了安卓上下文相关对象,如:ActivityComponent中注入的类,直接可以通过注入获取Activity对象 以上面接口实现类为例子 1.构造方法中使用@ActivityContext

1.4K20

上手指南 | Jetpack Hilt 依赖注入框架

Jetpck Dagger-Hilt 依赖注入是什么 一个类里面有一个变量,这个变量就是这个类的依赖。然后通过外部注入对这个变量进行赋值,这种就叫做依赖注入。...Hilt 是什么 ​ HiltAndroid 的依赖注入库,其实是基于 Dagger 。可以说 Hilt 是专门为 Andorid 打造的。 ​ Hilt 创建了一组标准的 组件和作用域。...这些组件会自动集成到 Android 程序的生命周期中。使用的时候可以指定使用的范围,事情作用在对应的生命周期当中。...api "com.google.dagger:hilt-android:2.28-alpha" kapt "com.google.dagger:hilt-android-compiler:2.28-alpha... Android 组件的使用 如果使用 @AndroidEntryPoint 注解 Android 类,还必须注解依赖他的 Android 类; 例如: 给 fragment 使用 @AndroidEntryPoint

1.7K20

Hilt-依赖注入框架上手指南

Hilt-依赖注入框架上手指南 Hilt 是Google 最新的依赖注入框架,其是基于Dagger研发,但它不同于Dagger。...对于Android开发者来说,Hilt可以说专门为Android 打造,提供了一种将Dagger依赖项注入Android应用程序的标准方法,而且创建了一组标准的组件和作用域,这些组件会自动集成到Android...在学习本文之前,假定大家已经了解依赖注入是什么,如果没有了解过,可以先了解概念。Hilt 的目的是降低Android 开发者使用依赖注入框架的上手成本,但是基本的理念大家还是要明白。...先导入依赖 implementation 'com.google.dagger:hilt-android:2.28-alpha' kapt 'com.google.dagger:hilt-android-compiler...: 'dagger.hilt.android.plugin' 举个: 我们有一个 NetDataSource的 远程数据类,然后我们可能需要在Activity调用,代码如下 class NetDataSource

1.7K10

上手指南 | Jetpack Hilt 依赖注入框架

Jetpck Dagger-Hilt 依赖注入是什么 一个类里面有一个变量,这个变量就是这个类的依赖。然后通过外部注入对这个变量进行赋值,这种就叫做依赖注入。...Hilt 是什么 ​ HiltAndroid 的依赖注入库,其实是基于 Dagger 。可以说 Hilt 是专门为 Andorid 打造的。 ​ Hilt 创建了一组标准的 组件和作用域。...这些组件会自动集成到 Android 程序的生命周期中。使用的时候可以指定使用的范围,事情作用在对应的生命周期当中。... Android 组件的使用 如果使用 @AndroidEntryPoint 注解 Android 类,还必须注解依赖他的 Android 类; 例如: 给 fragment 使用 @AndroidEntryPoint...AndroidEntryPoint class FragmentOne : BaseLayoutFragment() { //使用 @Inject 从组件获取依赖进行注入

1.6K30

Jetpack Hilt 依赖注入框架上手指南

,并在运行时注入到对应的字段,就是依赖注入,目的是为了类的解耦 例子:A 类 中用到了 B 类,一般情况下需要在 A 类 new B() 的实例对象 采用依赖注入后, A 类 定义一个私有的 B...并在运行的时候通过从相关的容器获取出来 B 的对象并注入到 A 类的 字段。 这样做的好处是什么? 如果有很多个类需要使用 B 类。难道都要在各自的类中进行 new B() 吗。...使用 依赖注入则就变得很简单了。 Hilt 是什么 HiltAndroid 的依赖注入库,其实是基于 Dagger 。可以说 Hilt 是专门为 Andorid 打造的。...Hilt 创建了一组标准的 组件和作用域。这些组件会自动集成到 Android 程序的生命周期中。使用的时候可以指定使用的范围,事情作用在对应的生命周期当中。...api "com.google.dagger:hilt-android:2.28-alpha" kapt "com.google.dagger:hilt-android-compiler:2.28-alpha

1.5K20

Hilt 稳定版发布 | 更便捷的 Android 依赖项注入

Hilt 是 Jetpack 推荐使用的 Android 应用 依赖项注入 (DI) 解决方案,现已 稳定。这意味着 Hilt 已经完全可以 生产环境 中使用。...配置 Hilt 之后,项目中从无到有地向 Activity 注入ViewModel 就像在代码添加注解一样容易,如下所示: @HiltAndroidApp // 应用配置 Hilt class...我强烈推荐利用 Dagger Android 应用中进行依赖项注入,然而单纯地使用 Dagger 可能导致创建时内存占用过多。...当这与 Android 开发各种复杂的可感知生命周期组件一起使用时,就可能出现很多陷阱,例如内存泄漏: 作用域为 Activity 的依赖项被意外地传递到 ViewModel 。...想要了解更多并开始您的应用中使用,请参阅如下资源: 了解使用依赖项注入的收益 了解如何在您的应用中使用 HiltDaggerHilt 的迁移指南 Codelabs 逐步学习

1.9K20

Jetpack新成员,一篇文章带你玩转Hilt和依赖注入

橙色部分表示的是仓库层,仓库层要做的工作是判断接口请求的数据应该是从数据库读取还是从网络获取,并将数据返回给调用方。简而言之,仓库的工作就是本地和网络数据之间做一个分配和调度的工作。...而ViewModel层当中,GoogleJetpack中提供了专门的API来获取ViewModel的实例,所以它的实例创建也是不用我们去操心的。...根据Android团队发布的调查,49%的Android开发者希望Jetpack能够提供一个更加简单的依赖注入解决方案。 于是,Google今年发布了Hilt。...事实上,HiltDagger2有着千丝万缕的关系。Hilt就是Android团队联系了Dagger2团队,一起开发出来的一个专门面向Android的依赖注入框架。...接下来,app/build.gradle文件,引入Hilt的插件并添加Hilt的依赖库: ... apply plugin: 'kotlin-kapt' apply plugin: 'dagger.hilt.android.plugin

2.6K30

Kotlin 中使用 Hilt 的开发实践

Hilt 是基于 Dagger 开发的全新的依赖项注入代码库,它简化了 Android 应用 Dagger 的调用方式。本文通过简短的代码片段为您展示其核心功能以帮助开发者们快速入门 Hilt。...Hilt 模块 就好像 "菜谱",它可以告诉 Hilt 如何创建那些不具备构造函数的类的实例,比如接口或者系统服务。 此外,您的测试,任何模块都可以被其它模块所替代。...这有利于使用 mock 替换接口实现。 模块通过 @InstallIn 注解被安装在特定的 Hilt 组件 。这一部分我会在后面详细介绍。...选项 1: 使用 @Binds 为接口创建绑定 如果您希望需要 Milk 时候,使用 OatMilk 代码取而代之,那么可以模块创建一个抽象方法,然后为该方法添加 @Binds 注解。...,但是如果您使用了不含有 Dagger 的库或者尚未在 Hilt 中支持的 Android 组件,那么您可能需要创建您自己的入口点来手动访问 Hilt 依赖图谱。

1.1K30

Dagger 迁移到 Hilt 可带来的收益

Hilt 发布于 2020 年 6 月,为 Android 提供了依赖项注入 (DI) 的标准化方案。...对于新项目,Hilt 有着编译期校验,良好的运行时性能以及扩展性 (阅读文章 AndroidHilt 限定作用域,获取更多信息)。然而,Hilt 对于已经使用 Dagger 的应用有何优势呢?...了解 Dagger 应用的配置和使用是一项艰巨且耗时的工作。 通过应用中使用 Hilt,上述工作量将会显著减少,因为所有 Hilt 应用都使用相同的配置。...但是,自定义组件和 Hilt 内置组件的区别在于,这些组件无法自动注入Android Framework 的类 (即 @AndroidEntryPoint 的功能)。...如果允许 Hilt 接管 SingletonComponent,则可以应用某些部分使用 Hilt 的特性,并从中受益,而其他特殊部分仍保留 Dagger

80510

Hilt三问—你了解依赖注入

Hilt是啥,怎么用? 很明显,Hilt就是一个依赖注入库,一个封装了DaggerDagger的基础上进行构建的一个依赖注入库。...Dagger我们都知道是一个早期的依赖注入库,但确实不好用,需要配置很多东西,那么Hilt简单到哪了呢?...用于提供类的依赖,也就是代表这个类会用到注入的实例。 @Inject。这个注解是用来告诉 Hilt 如何提供该类的实例,它常用于构造函数、非私有字段、方法Hilt支持哪些类的依赖注入。...如果是其他的Android类,必须在它依赖的Android类添加同样的注解,例如在 Fragment 添加@AndroidEntryPoint注解,必须在Fragment依赖的Activity上也添加...提供单例 3)为ViewModel提供的专门的注解 @ViewModelInject,Viewmodel对象的构造函数中使用 @ViewModelInject 注解可以提供一个 ViewModel

1.1K00

Hilt 介绍 | MAD Skills

Android 应用,您可以通过遵循依赖项注入的原则,为良好的应用架构奠定基础。这有助于重用代码、易于重构、易于测试!更多关于 DI 的好处,请参阅: Android 的依赖项注入。...当类型是一个接口,或者您无法构造函数上添加 @Inject,例如类来自于您无法修改的库。 假设我们应用 使用 Room 作为持久性存储库。...除了 ViewModel,每个集成都需要在项目中添加不同的库。获取更多信息,请查阅: Hilt 和 Jetpack 集成。...就是这样,Hilt 会帮助您创建 ViewModel 的提供程序,您无需再手动处理。 了解更多 Hilt 基于另一个流行的依赖注入Dagger 进行构建!...接下来的文章Dagger 将会被频繁提及!如果您正在使用 DaggerDagger 可以与 Hilt 配合使用,请查看我们之前的文章《从 Dagger 迁移到 Hilt 可带来的收益》。

1K10

Android 面试题:为什么 Activity 都重建了 ViewModel 还存在?—— Jetpack 系列(3)

:从 Dagger2 到 Hilt 玩转依赖注入(一)[7] 11、Hilt:从 Dagger2 到 Hilt 玩转依赖注入(二) 12、OnBackPressedDispatcher:处理回退事件的新姿势...Activity / Fragment 与视图无关的职责抽离出来, MVP 模式叫作 Presenter, MVVM 模式叫作 ViewModel。...:1.0.0" // Hilt 注解处理器 kapt "androidx.hilt:hilt-compiler:1.0.0" 需要注意的是,虽然可以使用依赖注入普通对象的方式注入 ViewModel,...具体来说,使用 ViewModelProvider 时,我们需要传入一个 ViewModelStoreOwner 宿主接口,它将在 getViewModelStore() 接口方法返回一个 ViewModelStore...:从 Dagger2 到 Hilt 玩转依赖注入(一): https://juejin.cn/post/6947655947875516424 [8] 12、OnBackPressedDispatcher

1.2K20

kotlin--综合运用Hilt、Paging3、Flow、Room、Retrofit、Coil等实现MVVM架构

= "2.28-alpha" implementation "com.google.dagger:hilt-android:$hilt_version" kapt "com.google.dagger...:通过构造函数,给ViewModel注入实例 1.Application注入HiltAndroidApp @HiltAndroidApp class APP : Application() 别忘了Manifest...配置 2.Activity开始查找注入对象 使用AndroidEntryPoint注解来表示,Hilt开始查找注入对象 @AndroidEntryPoint class MainActivity :...2.对ViewModel暴露获取数据接口:Repository 定义一个Repository接口获取Flow>数据,T应该为MovieItemModel,因为对外(ViewModel...Model层的架构搭建完毕后,我们需要ViewModel层与Model层作数据交互 Hilt注入ViewModel构造函数 ViewModel需要Repository对象作为属性,而Hilt支持使用

3.5K31

Android 通过 Hilt 进行依赖项注入

Hilt 热门 DI 库 Dagger 的基础上构建而成,因而能够受益于 Dagger 的编译时正确性、运行时性能、可伸缩性和 Android Studio 支持。...由于许多 Android Framework 的类都是由操作系统自身实例化的,因此 Android 应用中使用 Dagger 时,会存在与此相关的模板代码。...不同于 DaggerHilt 集成了 Jetpack 库以及 Android Framework 的类,并移除了大部分模板代码,使您可以专注于定义和注入绑定的重要环节,而无需担心管理 Dagger...对 Jetpack 的支持 您可以通过 Hilt 轻松使用您喜欢的 Jetpack 库。在此版本,我们支持 ViewModel 和 WorkManager 直接注入。...Codelab 我们发布了如下两个 Codelab,手把手教您使用 Hilt: Android 应用中使用 HiltDagger 应用迁移到 Hilt 示例代码 您是否想在现存应用查看如何使用

1.8K20

Android MVVM框架搭建(十)Hilt、ViewBinding、Activity Result API

一、依赖 首先是添加依赖,使用Hilt的步骤稍微有一些多,分为三步, 第一步:首先在工程的build.gradle添加,如下代码: classpath 'com.google.dagger:hilt-android-gradle-plugin...:2.28-alpha' 添加位置如下图所示: 第二步:app下的build.gradle添加插件,代码如下: apply plugin: 'dagger.hilt.android.plugin...' 添加位置如下图所示: 第三步:app下的build.gradle的denpendencies{}闭包添加如下代码: implementation "com.google.dagger:hilt-android...如果是自定义的类要使用注入则使用dagger2的就可以了。 2....不支持@AndroidEntryPoint的类需要使用接口完成注入utils包下新建一个MVUtilsEntryPoint接口,里面的代码如下: @EntryPoint @InstallIn(ApplicationComponent.class

1.9K30

DaggerHilt,谷歌为何执着于让我们用依赖注入

你对 Dagger 一无所知。 而就在上个月,Android 团队又在 Jetpack 里面又增加了一个新的依赖注入库:Hilt。...这个 Hilt 是专门针对于 Android 平台的依赖注入库,它是基于 Dagger 的。 啊?基于……Dagger?这次到底是真正的神器到来,还是又一个大坑?...Hilt 怎么帮助我们进行依赖注入 Hilt 是 Google 专门针对 Android 平台做的一个依赖注入库。...例如在 Dagger 里,你要对某个类的依赖进行注入,你需要手动获取依赖图和执行注入依赖操作: ? 而在 Hilt 里,注入会自动完成: ?...这一类情况我们的做法通常是获取外部 Activity 对象然后强转,再去拿它内部的对象: ? 而如果用 Hilt,你可以把这个对象直接声明出来,让它自动注入: ?

1.3K20

Jetpack 重磅更新!

v=R3caBPj-6Sg&feature=youtu.be New in Alpha Hilt - Jetpack 推荐的依赖注入类库 译者注:前几天掘金有一篇介绍 Hilt 的文章 神一样的存在,Dagger...,看评论区很多读者 仍然把它当成 Dagger 。其实官方也知道 Dagger2 难用,学习曲线陡峭,所以有了 Hilt,一个基于 Dagger2 的为 Android 准备的依赖注入类库。...Hilt 是一个帮助你简化 依赖注入 操作的 Android 类库,它让你可以专注于定义和注入的重要部分, 而无需担心管理所有的 DI 设置。...例如,要注入 ViewModel 的参数的话,你可以 ViewModel 的构造函数上添加 @ViewModelInject 注解,并在 Fragment 上添加 @AndroidEntryPoint...我们发布的博客 Dependency Injection on Android with Hilt ,可以了解 Hilt 的更多信息。

1.2K70

AndroidHilt 限定作用域

当涉及到 DI (依赖项注入) 时,限定对象 A 的作用域为一个容器,则意味着该容器销毁之前始终提供相同的 A 实例。 Hilt ,您可以通过注解将类型的作用域限定在某些容器或组件内。... Android ,您不使用 DI 库也可以通过 Android Framework 来手动限定作用域。让我们看看如何手动限定作用域,以及如何改用 Hilt 来限定作用域。... Android 限定作用域 看了上文的定义,您可能会有这样的异议: 某个特定类中使用一个类型的实例变量也可以做到限定该变量类型的作用域。没错!...使用 Hilt 注入 ViewModel 如上文所述,您可以使用 @ViewModelInject 向 ViewModel 注入依赖项。...由于可以 ViewModelProvider 中使用这些 ViewModel 工厂,使您获取 ViewModel 的方式变得更加灵活。

1.4K20
领券