如何在可组合物中使用刀柄注入单例

Posted

技术标签:

【中文标题】如何在可组合物中使用刀柄注入单例【英文标题】:How to inject a singleton using hilt inside a composable 【发布时间】:2022-01-24 03:42:25 【问题描述】:

我正在尝试注入一个单例类,该类在可组合内的 hiltmodule 中定义。 我知道如何注入视图模型,但是单例类呢?

@Inject
    lateinit var mysingleton: MySingletonClass

此代码在活动中运行良好,但将其从活动带到使用它的可组合项还有很长的路要走... 有更好的解决方案吗?

【问题讨论】:

【参考方案1】:

您不能将依赖项注入到函数中,@Composable 就是这样。 @Composable 函数没有依赖关系,但可以获取 Hilt 函数返回的值,例如 hiltViewModel()。

如果您需要访问 @Composable 内的 ViewModel 范围(或应用程序范围)单例,您可以将该单例注入 ViewModel,然后从 @Composable 访问 ViewModel。

您可以通过将 ViewModel hilt 模块中该对象的提供程序函数注释为 @ViewScoped 来将该单例注入 ViewModel。

您可以将提供程序安装到 SingletonComponent::class 中并将其注释为 @Singleton,如果您想要整个应用程序的单例,而不是每个 ViewModel 实例的单例。更多信息here.

Hilt 模块文件

@Module
@InstallIn(ViewModelComponent::class)
object ViewModelModule 

    @ViewScoped
    @Provides
    fun provideMySingleton(): MySingletonClass = MySingletonClass()

您的 ViewModel 类:

@HiltViewModel
class MyViewModel
@Inject constructor(
    val mySingleton: MySingletonClass
): ViewModel() 

...


你的@Composable 函数:

@Composable fun DisplayPrettyScreen() 
...
    val viewModel: MyViewModel = hiltViewModel()
    val singleton = viewModel.mySingleton  //no need to assign it to a local variable, just for explanation purposes


【讨论】:

以上是关于如何在可组合物中使用刀柄注入单例的主要内容,如果未能解决你的问题,请参考以下文章

如何在可组合函数回调中调用 Kotlin 协程?

如何从卡片或类似物中获取标题与弹性盒子具有相同的高度?

在可编辑网格中,如何使 Ext 组合框在选择项目时立即完成编辑模式?

刀柄找不到服务

在组合 api 中使用注入变量(nuxt.firebase)

模块化车刀柄为什么可以解决车削加工中刀尖崩损导致刀柄损坏等问题