[英]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.