2

我正在尝试使用 Kotlin 序列化和 Hilt 来实现 Proto Datastore。

参考:https ://medium.com/androiddevelopers/using-datastore-with-kotlin-serialization-6552502c5345

我无法使用新的 DataStore 创建语法注入 DataStore 对象。

@InstallIn(SingletonComponent::class)
@Module
object DataStoreModule {

    @ExperimentalSerializationApi
    @Singleton
    @Provides
    fun provideDataStore(@ApplicationContext context: Context): DataStore<UserPreferences> {
        val Context.dataStore: DataStore<UserPreferences> by dataStore(
            fileName = "user_pref.pb",
            serializer = UserPreferencesSerializer
        )
        return dataStore
    }

}

我收到了 lint 消息Local extension properties are not allowed

如何注入这个 Kotlin 扩展属性?或者有什么方法可以注入 dataStore 对象?

4

2 回答 2

1

您不能在本地上下文中使用扩展,您应该这样调用:

@InstallIn(SingletonComponent::class)
@Module
object DataStoreModule {

    @ExperimentalSerializationApi
    @Singleton
    @Provides
    fun provideDataStore(@ApplicationContext context: Context): DataStore<UserPreferences> =
         DataStoreFactory.create(
            serializer = UserPreferencesSerializer,
            produceFile = { context.dataStoreFile("user_pref.pb") },
        )
}
于 2021-09-10T18:57:39.640 回答
0

找到了一种在 Hilt 中使用预定义限定符的方法

现在没有 DataStoreModule 类。我直接将应用程序上下文注入到 Datastore Manager 类中。下面是代码。

@Singleton
class DataStoreManager @Inject constructor(
    @ApplicationContext private val context: Context,
) {

    private val Context.userPreferencesDataStore: DataStore<UserPreferences> by dataStore(
        fileName = "user_pref.pb",
        serializer = UserPreferencesSerializer
    )

    val userPreferencesFlow: Flow<UserPreferences> =
        context.userPreferencesDataStore.data.catch { exception ->
            // dataStore.data throws an IOException when an error is encountered when reading data
            if (exception is IOException) {
                Timber.e("Error reading sort order preferences. $exception")
                emit(UserPreferences())
            } else {
                throw exception
            }
        }

    suspend fun updateUid(uid: String) {
        context.userPreferencesDataStore.updateData { userPreferences ->
            userPreferences.copy(uid = uid)
        }
    }

    suspend fun getUid(): String {
        return userPreferencesFlow.first().uid
    }
}

这就像一个魅力。

于 2021-06-27T17:11:00.307 回答