如何使用 hilt 而不是使用工厂来初始化 viewModel 中的参数

2024-03-09

现在我使用 viewModelFactory 来初始化片段中 viewModel 的参数。

class MyFragment : Fragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        val binding = FragmentMyBinding.inflate(inflater)
        binding.lifecycleOwner = this
        val argument = MyFragmentArgs.fromBundle(requireArgument()).myArgument
        val viewModelFactory = MyViewModelFactory(myArgument, application)
        binding.viewModel = ViewModelProvider(
                this, viewModelFactory).get(MyViewModel::class.java)
        return binding.root
    }
}

class MyViewModelFactory(
        private val myArgument: MyArgument,
        private val application: Application) : ViewModelProvider.Factory {
    @Suppress("unchecked_cast")
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
            return MyViewModel(myArgument, application) as T
        }
        throw IllegalArgumentException("Unknown ViewModel class")
    }
}

与 hilt 依赖注入方式相比,有没有办法直接将参数传递给 viewModel ?


是的。使用 Hilt,您可以完全抛弃工厂模式。

要注入参数,您可以使用@ViewModelInject注释,并注入viewModel在活动中您可以使用by viewModels()方法来自androidx.activity包裹。

这是一个例子。

产品视图模型.kt

import androidx.hilt.lifecycle.ViewModelInject

class ProductsViewModel @ViewModelInject constructor(
    private val foo: Foo
    private val bar: Bar
) : ViewModel() 

产品活动.kt

@AndroidEntryPoint
class ProductsActivity : AppCompatActivity(){
    
    val viewModel: ProductsViewModel by viewModels()
    
}

要查看实际效果,您可以结帐这个仓库 https://github.com/theapache64/nemo/tree/master/app/src/main/java/com/theapache64/nemo/feature/products.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 hilt 而不是使用工厂来初始化 viewModel 中的参数 的相关文章

  • Android 从图库中选择图像显示内存错误

    我正在编写一个代码示例 我必须从图库中选择一个图像 该代码正在运行 但是在从图库中选择图像后 我得到了内存不足错误 in my 活动结果时 我可以获得小图像 但大图像会产生问题 这是我的代码 try Uri selectedImageUri
  • Android Wear - 在没有 WearableListenerService 的情况下从 Wear 接收消息?

    我正在开发一款适用于 Android Wear 的应用程序 它可以在手机上启动活动 一切都很好 但我不想依赖手机上不断运行的后台服务来接收此消息 理想情况下 我会让 WearableListenerService 与应用程序同时启动 并保持
  • Android布局中如何实现Button的自动宽度

    我有几个垂直列出的按钮 我需要它们都具有相同的宽度 而且还要显示其中的所有文本 基本上我需要所有它们的宽度作为最大的宽度的包裹宽度 希望我解释得很好 现在 我已经有一种布局可以在我的 Samsung Galaxy S2 4 1 2 上运行
  • 这个错误从何而来?错误:com.facebook.FacebookException:无法获取应用程序名称

    我无法弄清楚这一点 我已将我的密钥哈希和所有内容添加到 Facebook 网页 但我无法找出此错误 11 12 19 51 27 744 D HelloFacebook 5188 Error com facebook FacebookExc
  • 在 Android Studio 中使用预构建的共享库

    我需要在我的 android 项目中使用自定义的预构建共享库 在独立 ndk 上构建为 libdynamic so 我在路径 src main 中创建了一个文件夹 jniLibs 然后在其中创建了 4 个文件夹 即 armeabi arme
  • 如何避免内存不足异常

    在我的应用程序中 我使用图像的 url 从网络下载图像 我有很多图像 因此我为此实现了分页技术 并按垂直顺序为每页显示 15 个图像 在这种情况下 我向上 向下滚动页面以查看图像 此时我的应用程序崩溃了 并且出现了内存不足异常 请任何人帮助
  • 为什么大多数 Android 设备不像典型操作系统那样有交换区域?

    现在有 Android 支持交换区域来提高性能吗 出于哪些考虑 大多数 Android 设备放弃了该功能 现在有 Android 支持交换区域吗 Quoting 黛安 哈克伯恩 https groups google com d msg a
  • Buildozer Numpy RuntimeError:工具链损坏:无法链接简单的 C 程序

    用 Python 编写我的第一个 Android 应用程序并使用 Buildozer 对其进行打包 因为稍后在项目中需要使用numpy 所以我尝试打包以下测试代码 import numpy import kivy kivy require
  • 改造添加带有令牌和 ID 的标头

    我在获取经过身份验证的用户时遇到问题 在此之前我得到了令牌和用户 ID 现在我需要使用访问令牌和 ID 从服务器获取用户 我有标题格式 https i stack imgur com OQ87Y png 现在我尝试使用拦截器添加带有用户令牌
  • Android Studio 3.0 - 设置未保存

    我已将 文件 gt 设置 gt 编辑器 gt 代码样式 中的 右边距 列 从默认的 100 增加到 140 不幸的是 每次重新启动 Android Studio 后 该边距都会重置 我还尝试导出和导入我的设置 但这并不能阻止重置右边距 希望
  • Kotlin 中的枚举类对于 Android 来说是否像 Java 中那样“昂贵”?

    Are EnumKotlin 中的类对于 Android 来说 昂贵 就像 Java 一样 还可以用吗 IntDefs or StringDefs在科特林 当我将 Kotlin Enum 类反编译为 Java 类时 底层仍然使用了 Java
  • 改变换行行为

    我可以在 TextView 中使用 Spannable 创建具有不同外观 下划线 删除线等的跨度 我怎样才能做同样的事情来改变换行行为 特别是 我不希望电子邮件地址在中间换行 我希望它像一个单词一样 I tried 包裹在一起跨度 http
  • Android Studio 1.0 在 dexDebug 或 dexRelease 上构建失败

    我最近从 Android Studio 0 9 2 升级到 1 0 包括 Gradle 插件版本 1 0 0 并且在构建项目时遇到问题 每当我构建时 我都会在 dexDebug 或 dexRelease 步骤中收到以下异常 UNEXPECT
  • Android:如何停止监听电话监听器? [复制]

    这个问题在这里已经有答案了 可能的重复 Android 为什么 PhoneCallListener 在活动完成后仍然存在 https stackoverflow com questions 11666853 android why phon
  • 如何在 Google 地图中创建自定义地图?

    我正在尝试创建一个包含我家地图的 Google 地图应用程序 卧室 浴室 厨房等 使用 GPS 我会找到我现在在家里的位置 并尝试获取到我卧室的方向 步行距离 您可以使用Google的API来获取方向 我需要知道的是 如何添加我家的自定义地
  • 上传失败您应该使用 http 和 https 作为您的 Web 意图过滤器的方案

    上传失败 您应该使用 http 和 https 作为您的 Web 意图过滤器的方案 我在将免安装应用上传到 Play 商店时收到此错误 我在清单中声明了 http 和 https 的意图过滤器 如下所示
  • 什么是“多重”启动模式?

    On http developer android com guide topics manifest activity element html http developer android com guide topics manife
  • Android Wear Overlay 传递触摸事件

    我有一个 Android Wear 应用程序 其中我使用透明的覆盖视图来接收触摸事件 我需要能够接收屏幕上任何位置发生的所有触摸事件 并且还能够看到它们的坐标 我发现的所有研究都表明我无法接收所有触摸事件并将其传递 然而 and 都在做这样
  • 如何在 Android 上设置 Google Drive API?

    我一直在尝试将 Google Drive 功能集成到我的应用程序中 但我无法使用任何内置功能 因此我相信我要么错过了一个步骤 要么做得不正确 我正在遵循官方的 Google 开发者指南 https developers google com
  • 如何在给定的纬度和经度处使用标记/覆盖项目启动地图意图?

    我有一个纬度和经度 我想打开以该点为中心的谷歌地图 所以我使用以下代码 Intent intent new Intent android content Intent ACTION VIEW Uri parse geo lat lng st

随机推荐

  • 如何根据泛型类型执行泛型结构体方法的不同实现?

    我有一个通用结构 我在扩展中的结构中添加了一个方法 如下所示 struct CustomStruct
  • JavaScript 模板继承

    在Django框架中 网页模板可以继承其他模板 在子模板中 您定义代码块来覆盖父模板中类似名称的块 我猜还有其他后端模板系统也以这种方式工作 但 Django 是我熟悉的一个 现有的 javascript 模板系统是否支持 django 风
  • Emacs 插入居中注释块

    我想为 emacs 创建一个宏 它将插入一个带有一些居中文本的乳胶注释块 例如 Comment 1 Comment 2 Commenttext 3 这可
  • 电子邮件地址输入验证

    有没有办法在 wpf C 中对电子邮件地址进行文本框输入验证 正则表达式或验证表达式或任何可以提供帮助的内容 最好提供代码示例和一些说明 在 text changed 事件中 您可以将文本框的值传递给辅助类 public static cl
  • PHP Curl 脚本每 10 分钟从远程服务器提取数据

    我正在尝试创建一个 PHP 脚本 该脚本从远程服务器提取 xml 数据 文本和图像 并将其插入本地数据库中 我需要每 10 分钟左右运行一次此脚本 并覆盖数据库中的现有数据 如果大约一分钟后没有收到服务器的响应 我希望请求中止 直到下一个脚
  • 如果可能,使用 AJAX 从 URL 获取 JSON 数据

    我想从下面的 URL 获取 JSON 数据 并以任何可能的方式在我的网页中使用它 可以吗 http fantasy premierleague com web api elements 100 http fantasy premierlea
  • AWS Elastic Beanstalk 504 网关超时

    我有一个在 AWS Elastic Beanstalk 上运行的节点服务器 我的一个端点接受巨大的有效负载 并且该函数本身相当缓慢且冗长 可能需要长达 10 多分钟的时间 由于业务需求 它必须保留为单个 HTTP POST 并且不能拆分得更
  • 错误通知:无法展开 RemoteViews:StatusBarNotification。在 Android 牛轧糖上

    I use OneSignal SDK显示通知 我这样做是在OneSignalPushService java OneSignalPushService java public class OneSignalPushService exte
  • Chrome 扩展配置代理用户名和密码

    我正在创建一个 chrome 扩展来动态更改代理设置 但在 chrome proxy settings set 函数中 无法配置代理的用户名和密码 因此 每次设置更改后我都必须手动输入凭据 但我发现在代理自动验证 https chrome
  • 为什么我在看似相似的 R 代码中遇到函数错误?

    首先 这是一个非常基本的问题 我不确定如何表达 如果问题是重复的 尽管我使用我认为可能合适的措辞进行了检查 我显然会撤回并欣赏该链接 第二 我是sure有一种更简单的方法可以完成我正在尝试的事情 但又不想偏离轨道 好的 我试图从 0 1 矩
  • 将主机字节顺序(小端)中的字符串转换为网络字节顺序(大端)

    我有一个十六进制字符串 内容如下18000000该字符串采用主机字节顺序 小端 我需要将其转换为网络字节顺序 大端 生成的十六进制字符串将是00000018 总结一下我需要转换 18000000 to 00000018 我如何在 PHP 中
  • pandas groupby 对象的聚合

    我正在尝试从数据块的 groupby 对象中聚合一些统计信息 我必须对数据进行分块 因为有很多 1800 万 行 我想找到每个块中每个组的行数 然后将它们加在一起 我可以添加 groupby 对象 但当一项中不存在组时 结果为 NaN 看这
  • BST 插入不起作用

    我试图实现二叉搜索树的代码 问题是以下代码不起作用 但如果我传递双指针来插入函数 如 insert struct bst node data 它就会起作用 我认为它也应该适用于传递单个指针 谁能解释一下这里的错误是什么 void inser
  • 使用 LaTeX Beamer 显示代码

    我在 Beamer 演示文稿中使用以下 LaTeX 代码 begin frame begin figure centering tiny lstset language python lstinputlisting code get ext
  • 记录器应该始终是最终的和静态的吗?

    可以从多个线程访问类 在这种情况下 记录器也必须是最终的和静态的吗 谢谢 所有主要的 java 日志记录包 java util logging log4j等 是同步且线程安全的 标准模式aprivate final static即使从多个线
  • CMS 中搜索表单的 POST 与 GET 方法

    我有点被一件事困住了 只是无法决定在搜索表单中使用 POST 还是 GET 方法 通常我会使用 GET 方法来创建这样的表单 这样用户就可以为他们得到的结果添加书签 但这一次 搜索表单出现在管理区域中 因此结果很快就会相关 并且无需为结果添
  • 如何清除主屏幕上 IOS Web 应用程序的缓存?

    我正在使用 JQTouch 使用元标记 apple mobile web app capable 在主屏幕上创建一个 Web 应用程序 但无论我从 设置 中清除缓存多少次 该 Web 应用程序的 Javascript 仍然是较旧的缓存版本
  • 服务已重新启动,并显示 START_NOT_STICKY

    我有一个在后台运行的服务 如果系统在内存不足的情况下杀死该服务也没关系 但是 我不希望系统重新启动该服务 因此 为了做到这一点 我从 onStartCommand 返回 START NOT STICKY 标志 如下所示 public int
  • android.widget.TabHost.dispatchWindowFocusChanged 处的 java.lang.NullPointerException(TabHost.java:298)

    我的程序的许多用户报告 强制关闭 相同的错误 但我无法重现该错误 因此很难调试 看来它与 TabHost 有关 我的应用程序中有两个 现在 我尝试扩展 TabHost 覆盖dispatchWindowFocusChanged 并测试 get
  • 如何使用 hilt 而不是使用工厂来初始化 viewModel 中的参数

    现在我使用 viewModelFactory 来初始化片段中 viewModel 的参数 class MyFragment Fragment override fun onCreateView inflater LayoutInflater