使用 Hilt 提供首选项数据存储

2024-03-27

我试图提供一个共同的DataStore<Preferences>这样可以在多个地方使用相同的首选项文件,但我收到了有用的错误消息:

找不到符号:DaggerMyApplication_HiltComponents_SingletonC.builder()

@Module
@InstallIn(ApplicationComponent::class)
object DataStoreModule {
    
    @Provides
    fun provideDataStore(@ApplicationContext context: Context): DataStore<Preferences> = context.createDataStore("settings")
}

但是,我可以执行以下操作并在@Inject构造函数。

@Singleton
class DataStoreProvider @Inject constructor(@ApplicationContext context: Context) {

    val dataStore: DataStore<Preferences> = context.createDataStore("settings")
}

我假设扩展createDataStore正在做希尔特不喜欢的事情,但我希望能解释一下正在发生的事情,即使问题无法解决。


这对我有用:

    @Provides
    @Singleton
    fun dataStore(@ApplicationContext appContext: Context): DataStore<Preferences> =
        appContext.createDataStore("settings")

这个想法是把@Singleton位于提供者方法后面。


2021 年 2 月 9 日更新:
最好创建一个manager https://github.com/Drjacky/MVVMTemplate/blob/master/presentation/src/main/kotlin/app/web/drjackycv/presentation/datastore/DataStoreManager.kt并规定:

class DataStoreManager(appContext: Context) {

    private val settingsDataStore = appContext.createDataStore("settings")

    suspend fun setThemeMode(mode: Int) {
        settingsDataStore.edit { settings ->
            settings[Settings.NIGHT_MODE] = mode
        }
    }

    val themeMode: Flow<Int> = settingsDataStore.data.map { preferences ->
        preferences[Settings.NIGHT_MODE] ?: AppCompatDelegate.MODE_NIGHT_UNSPECIFIED
    }

}

应用程序模块 https://github.com/Drjacky/MVVMTemplate/blob/master/app/src/main/kotlin/app/web/drjackycv/mvvmtemplate/di/module/AppModule.kt:

@InstallIn(SingletonComponent::class)
@Module
class AppModule {
    @Provides
    @Singleton
    fun dataStoreManager(@ApplicationContext appContext: Context): DataStoreManager =
        DataStoreManager(appContext)

2021 年 3 月 20 日更新:
版本1.0.0-alpha07

private val Context.dataStore by preferencesDataStore("settings")

class DataStoreManager(appContext: Context) {

    private val settingsDataStore = appContext.dataStore

    suspend fun setThemeMode(mode: Int) {
        settingsDataStore.edit { settings ->
            settings[Settings.NIGHT_MODE] = mode
        }
    }

    val themeMode: Flow<Int> = settingsDataStore.data.map { preferences ->
        preferences[Settings.NIGHT_MODE] ?: AppCompatDelegate.MODE_NIGHT_UNSPECIFIED
    }
}

2021 年 5 月 1 日更新:

@Florian 完全正确,我忘了这一点。

Remove dataStoreManager来自 DI 模块的提供者。只是:

private val Context.dataStore by preferencesDataStore("settings")

@Singleton //You can ignore this annotation as return `datastore` from `preferencesDataStore` is singletone
class DataStoreManager @Inject constructor(@ApplicationContext appContext: Context) {

    private val settingsDataStore = appContext.dataStore

    suspend fun setThemeMode(mode: Int) {
        settingsDataStore.edit { settings ->
            settings[Settings.NIGHT_MODE] = mode
        }
    }

    val themeMode: Flow<Int> = settingsDataStore.data.map { preferences ->
        preferences[Settings.NIGHT_MODE] ?: AppCompatDelegate.MODE_NIGHT_UNSPECIFIED
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Hilt 提供首选项数据存储 的相关文章

  • Android ListView数组索引过滤后越界

    我认为这是专家的问题 我接到电话getView with positon 出界来自ListView数据列表 当我使用适配器过滤器时会发生这种情况 过滤器publishResults 方法使用小于原始列表的过滤列表填充数据 当新的过滤列表时似
  • Kotlin 中的单例类

    我想知道如何在 Kotlin 中创建一个单例类 以便我的 Util 类在每次应用程序执行时仅实例化一次 但是 当我将 Java 类转换为 kotlin 时 生成了以下代码 它是否正确 companion object private var
  • Android x86_64 和 x86 模拟器在 AlertDialog.onClick 事件上崩溃

    我正在 x86 64 和 x86 模拟器中测试 Android 应用程序 在从显示列表的 AlertDialog 中选择一个项目后 它崩溃了 Android 模拟器意外关闭 AlertDialog 是从 AppCompatActivity
  • Android 6 getAccountName() 缺少 android.permission.GET_ACCOUNTS

    在 Android 6 设备上运行时出现以下异常 java lang SecurityException Missing android permission GET ACCOUNTS 这看起来像是一个相当简单的例外 但对我来说并非如此 我
  • 无法运行 android/sdk/build-tools/23.0.2/aapt

    最近在 Ubuntu 15 上安装了 Android Studio 1 0 1 由于某些原因是旧版本 我正在尝试创建一个新项目 每当我构建它时 我都会收到此错误 无法运行程序 home user Android Sdk build tool
  • InflateException:二进制 XML 文件行 #8:膨胀类 ImageView 时出错

    我知道还有其他问题也问同样的事情 我已经看过其中的大部分了 大多数答案都涉及内存错误 我看不出如何ImageView只加载一个小图标 24x24 像素 可以做出类似这样的东西 但我想在这里发布堆栈跟踪 也许其他人可以识别我无法识别的东西并帮
  • 从另一个 Android 应用程序打开 Instagram 应用程序并发送带有标题的图像

    我基本上寻找的是从另一个应用程序打开 Instagram 应用程序并发送带有标题的图像 有一些有用的文档可以在 iOS 中执行此操作 iPhone 挂钩 https instagram com developer mobile sharin
  • MaterialComponents AlertDialog 文本颜色

    Reading MaterialComponents 主题警报对话框按钮 https stackoverflow com questions 52829954 materialcomponents theme alert dialog bu
  • Android 中的 JDBC 连接

    有没有人在 android 中尝试过 JDBC 连接 因为在 Android 2 3 中支持 JDBC 我必须在没有 Web 服务的情况下连接 Mysql 我已经提出申请 但它给了我错误 public class MysqlConnect
  • 动画图像视图

    目前我正在开发一款游戏 这是我的游戏的详细信息 用户应选择正确的图像对象 我希望图像从左到右加速 当他们到达终点时 他们应该再次出现在活动中 这是我正在处理的屏幕截图 我有 5 个图像视图 它们应该会加速 您有此类动画的示例代码吗 非常感谢
  • sqlite 插入表中 select * from

    我需要在 Android 应用程序中将数据从一个表移动到另一个表 我想使用以下sql insert into MYTABLE2 select id STATUS risposta DATETIME now data ins from MYT
  • 将原生 Twilio Android SDK 与 Flutter 集成

    我正在尝试使用 flutter 创建 IP 语音 VOIP 移动应用程序 我还没有看到 twilio 语音 api 的 flutter 插件的实现 所以我使用 MethodChannel 将我的应用程序与本机 android 语音 api
  • NativeScript 错误。在列表模板中找到多个视图

    我有这样的ListView
  • 推送通知需要很长时间才能到达

    我在适用于 iOS 和 Android 的 Adob e Air 应用程序中遇到推送通知的奇怪问题 我正在使用 Milkman Games 的 Easy Push ANE 以及 One Signal 服务 问题是通知确实会到达 但有时 随机
  • 在多模块项目中访问绑定适配器

    我有一个多模块项目 其中应用程序模块包含我的绑定适配器 而我的功能模块取决于我的应用程序模块 因为它是动态功能模块 应用程序 包含绑定适配器 gt 动态功能模块 存在布局的地方 我在所有模块中启用了数据绑定和 kapt 我无法成功构建应用程
  • 在Android中绘制圆角矩形

    我已经发现这个问题 https stackoverflow com questions 5618402 how to draw rounded rectangle in android ui解决方案是这段代码
  • 三星 tab2 平板电脑的 Android 开发

    是否可以使用 Eclipse 在 Samsung Tab 2 平板电脑中开发 Android 应用程序 需要安装什么驱动吗 当然可以 你必须安装标准的android开发工具 SDK ADT ad eclipse Juno最新版本 从这里下载
  • Listview里面只有一个Element

    您好 我正在尝试将列表视图放入列表视图中的列表视图中 唯一的问题是只有第一个列表视图正确显示所有元素 此后的每个列表视图仅包含一个元素 UPDATE 创建我自己的不可滚动列表视图解决了这个问题 https stackoverflow com
  • 在运行时用Dagger添加Retrofit RequestInterceptor

    我正在使用匕首和改装 我用 Dagger 注入我的 Retrofit 服务 现在我想做一个授权请求来获取 accessToken 之后 我想使用请求拦截器来增强我的 api 模块 以便将此访问令牌用于将来的请求 我的想法是在收到访问令牌后使
  • 如何为 Android Q 打开具有特定专辑或文件夹的默认图库应用程序?

    我尝试打开图库中的特定文件夹 如下代码所示 但它对我不起作用 并且出现错误无法找到物品 fun openDirectoryInGallery context Context directory String val intent Inten

随机推荐

  • 使用面板消息/解决方法时的 Java 1.5 JOptionPane 绘制错误?

    我有一个 JOptionPane 其中有一个自定义消息面板 位于面向 Java 1 5 的应用程序中 除其他内容外 该面板还包含一个 JTextField 每调用 20 次左右 对话框中就不会绘制任何内容 甚至 确定 取消 按钮也不会绘制
  • 让 docker-compose 只运行某些容器

    所以我目前可以使用 docker compose up test 它只运行我的数据库和测试脚本 我希望能够说 docker compose up app 或类似的东西来运行除测试之外的所有内容 这样我就不会运行不必要的容器 我不确定是否有办
  • 获取任意文件的二进制值

    如果假设我有一个文件 例如music mp3 or image jpg或任何要考虑的文件 我如何将这些文件的二进制表示形式转换为java中的字符串值 以便我可以查看它 例如 假设我有一个名为 video mp4 那么它必须表示为101011
  • Flask 和 Jinja2 使用漂白剂,图像 HTML 无法正常工作

    我一直在为自己的一个项目创建一个小博客 只有我作为用户才能访问发布页面 我之前一直在关注 Flask 教程 该教程的最终产品使您能够使用漂白剂和 Markdown 发布 HTML 并通过 Jinja2 模板传递它 In my models
  • Dockerfile 中的 AWS 凭证

    我需要在容器构建期间从 AWS S3 下载文件 但是我未能成功向构建过程提供 AWS 凭证 而无需将它们实际硬编码到 Dockerfile 中 我收到错误 docker 致命错误 无法找到凭据 尽管之前已经执行过 AWS 配置 此外 我无法
  • Intellij idea 中的 Ruby 设置

    这可能是显而易见的 但我无法在 Intellij 项目设置 编译器 插件等中找到 ruby 解释器路径以及任何其他可用的 ruby 设置 我确实安装了最新版本的 ruby 插件 并且使用的是 intellij 12 0 4 Ultimate
  • OOP 中的 php uasort

    class DBNews public function get latest posts limit code goes here posts array array uasort posts array this gt cmp publ
  • 在动作脚本 3 flex 4 中使用 DisplayObject(Group ,UIComponent) 剪切复制粘贴

    我正在我的应用程序中实现剪切复制粘贴 例如cacoo http www cacoo com 但我在这些操作过程中遇到问题 我正在使用剪切复制粘贴背后的想法 var className String getQualifiedClassName
  • 使用 Git 复制子模块

    我在 Git 中有一个项目 它有几个子模块 我需要下载这些子模块和可用的文件才能使用主项目 并且为了使子模块工作 我需要它们自己的子模块可用等等 为了进行设置 我使用递归地初始化子模块git submodule update init re
  • 具有三级深度连接的范围

    My Program桌子有很多Measures My Measure桌子有很多Targets My Target表有一列名为 money 我的 ActiveRecord 查询如下所示 programs2 Program includes m
  • 为什么当 TreeModel 添加新节点时我的 JTree 不更新?

    我正在使用一个DefaultTreeModel填充了覆盖DefaultMutableTreeNode它支持选择性地更改树中节点的显示字符串 如下面的代码所示 在我的表单中 我通过在单独的类中创建新节点来填充树 然后通过主数据类型的包装类将它
  • 计算不同的数,直到满足基于另一行的特定条件

    我有以下 df 原始df Step CampaignSource UserId 1 Banana Jeff 1 Banana John 2 Banana Jefferson 3 Website Nunes 4 Banana Jeff 5 A
  • 精确 HH:MM:SS 时间字符串的正则表达式模式

    我想准确验证字符串时间格式hh mm ss String 我的意思正是如此每个小时 分钟 秒必须是2 digits Also 仅接受逻辑值 like 小时 从 00 到 23 分钟 从 00 到 59 秒 从 00 到 59 当我检查时HH
  • 为什么我的 Oracle JVM 会为一个简单的“Hello World”程序创建所有这些对象?

    我正在玩jmap并发现简单的 Hello World Java 程序创建了数千个对象 这是对象的截断列表Oracle JVM 更新 131启动时创建 num instances bytes class name 1 402 4903520
  • geom_text 仅位于堆积条形图的顶部

    我想仅在堆叠条形图的顶部添加标签 这是我的数据框 create data frame building lt c Burj nKhalifa Zifeng nTower Bank of nAmerica Tower Burj Al Arab
  • 正则表达式,我可以排除字符对吗?

    如何从正则表达式中排除字符对 我正在尝试获取一个包含 5 个字母数字字符的正则表达式 后跟 除 XX 和 AD 之外的任何内容 后跟 XX So D22D0ACXX 会匹配 但是下面两个不会匹配 D22D0ADXX D22D0XXXX 我的
  • 将代理模型实例分配给外键

    我有一个 django auth 用户代理模型 它附加了一些额外的权限 如下所示 class User User class Meta proxy True permissions write messages May add new me
  • 中间人控制台:如何使用?

    我想知道如何使用middleman console 是一个简单的irb吗 我能用它做什么与简单的 irb 不同的事情 middleman console options Start an interactive console in the
  • 如何在量角器中设置单选按钮值

    我是量角器新手 我正在尝试使用量角器设置单选按钮值 我在互联网和 SO 上搜索了徒劳的答案 html
  • 使用 Hilt 提供首选项数据存储

    我试图提供一个共同的DataStore