繁体   English   中英

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

[英]How to inject a singleton using hilt inside a composable

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

@Inject
    lateinit var mysingleton: MySingletonClass

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

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

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

您可以通过将 ViewModel 刀柄模块中的 object 的提供程序 function 注释为 @ViewScoped 来将 singleton 注入 ViewModel。

您可以将提供程序安装到 SingletonComponent::class 并将其注释为 @Singleton,如果您想要整个应用程序的 singleton,而不是每个视图的 Z2ED500A3529637175E675A879EZB7 更多信息在这里

刀柄模块文件

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

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

您的 ViewModel class:

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

...

}

您的@Composable function:

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

}

我也认为这是不可能的,但后来找到了方法……试过了,似乎可行。

定义你的入口点接口:

private lateinit var dataStoreEntryPoint: DataStoreEntryPoint

@Composable
fun requireDataStoreEntryPoint(): DataStoreEntryPoint {
    if (!::dataStoreEntryPoint.isInitialized) {
        dataStoreEntryPoint =
            EntryPoints.get(
                LocalContext.current.applicationContext,
                DataStoreEntryPoint::class.java,
            )
    }
    return dataStoreEntryPoint
}

@EntryPoint
@InstallIn(SingletonComponent::class)
interface DataStoreEntryPoint {
    val dataStoreRepo: DataStoreRepo
}

DataStoreRepo 是 Hilt 中定义的 singleton

@Singleton
    @Provides
    fun provideDataStoreRepository(dataStore: DataStore<Preferences>): DataStoreRepo =
        DataStoreRepo(dataStore)

然后在可组合中使用:

@Composable
fun ComposableFuncionName(dataStoreRepo: DataStoreRepo = requireDataStoreEntryPoint().dataStoreRepo){
...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM