如何在可组合物中使用刀柄注入单例
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
【讨论】:
以上是关于如何在可组合物中使用刀柄注入单例的主要内容,如果未能解决你的问题,请参考以下文章
在可编辑网格中,如何使 Ext 组合框在选择项目时立即完成编辑模式?