kotlin 希尔特·辛格尔顿在我的部队里似乎不起作用

2sbarzqh  于 2022-12-04  发布在  Kotlin
关注(0)|答案(1)|浏览(90)

我面临着一个问题,比如我注入的存储库不是Singleton。
我有一个标记为@Singleton的存储库(实际上有很多,但我们简化一下)

@Module
@InstallIn(SingletonComponent::class)
class AppModule {
    @Provides
    @Singleton
    fun provideSettingsRepository(@ApplicationContext context: Context): SettingsRepository {
        return SettingsRepositoryImpl(context)
    }
}

下面是我的仓库的实现:

class SettingsRepositoryImpl(context: Context) : SettingsRepository {
    private var _flow = MutableStateFlow("init value")
    override fun getFlow(): StateFlow<String?> = _flow.asStateFlow()
    
    override fun setMyValue(value:String) {
        _flow.value = value
    }
}

当我把它作为我的服务的一部分使用时(在一些viewModels或其他带有DI的类中),它工作得很好。今天我实现了一个AIDL服务,并想做一些DI。我不得不使用字段注入,因为服务构造函数必须是空的。看起来我的应用程序所做的更新没有在使用服务的“TestApplication”上报告(就像我有两个仓库示例一样)。
这里我的服务代码:

@AndroidEntryPoint
class AppService : Service()  {
    @Inject lateinit var settingsRepository: SettingsRepository

    fun someActionOnMyRepository() {
        settingsRepository.setMyValue("whatever")
    }
}

当我从我的UI(viewModel或任何其他作为仓库注入的类)设置值时,它并没有在我的服务中更新。
我希望我的settingsRepository是一个单例。我遗漏了什么?是因为字段注入吗?
顺祝商祺

hmmo2u0o

hmmo2u0o1#

好的,问题不是来自Hilt,而是关于我如何在AndroidManisfest.xml中声明我的服务

<service android:name=".services.MyAppService"
            android:process=":remote" <----- THIS
            android:exported="true">

这意味着它就像另一个应用程序示例(所以不再有Singleton / SharedPreferences)。

相关问题