You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为每个Glance Widget创建独立的DataStore?

解决Glance Widget每个实例使用独立DataStore的问题

要让每个Widget实例拥有独立的DataStore,核心是利用框架提供的fileKey作为每个实例的唯一标识,为其创建专属的DataStore文件。你之前的错误在于试图将动态的fileKey绑定到静态的Context扩展属性中,这显然无法生效,因为fileKey是每个Widget实例独有的参数,只能在getDataStore方法内部动态使用。

修改后的完整代码

import androidx.datastore.core.DataStore
import androidx.datastore.core.DataStoreFactory
import androidx.glance.state.GlanceStateDefinition
import java.io.File

/**
 * Provides our own definition of "Glance state" using Kotlin serialization.
 */
object WeatherInfoStateDefinition : GlanceStateDefinition<WeatherInfo> {

    override suspend fun getDataStore(context: Context, fileKey: String): DataStore<WeatherInfo> {
        // 为每个Widget实例的fileKey创建独立的DataStore
        return DataStoreFactory.create(
            serializer = WeatherInfoSerializer,
            produceFile = { context.dataStoreFile(fileKey) }
        )
    }

    override fun getLocation(context: Context, fileKey: String): File {
        return context.dataStoreFile(fileKey)
    }
}

关键修改说明

  1. 移除固定文件名的扩展属性:删除了原来使用DATA_STORE_FILENAME的Context.datastore扩展属性,因为它会强制所有Widget实例共享同一个文件。
  2. 动态创建DataStore:在getDataStore方法中,直接使用传入的fileKey作为DataStore的文件名。fileKey是Glance框架自动为每个Widget实例生成的唯一标识符,确保每个实例对应独立的存储文件。
  3. 保持getLocation的正确实现:getLocation方法已经正确返回fileKey对应的文件路径,无需修改,它会与getDataStore中的配置保持一致。

这样修改后,每个Widget实例的状态都会存储在独立的DataStore文件中,不会再出现互相覆盖的问题,每个Widget的状态将独立维护。

内容的提问来源于stack exchange,提问作者ddxv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 06:06:22