如何为每个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) } }
关键修改说明
- 移除固定文件名的扩展属性:删除了原来使用
DATA_STORE_FILENAME的Context.datastore扩展属性,因为它会强制所有Widget实例共享同一个文件。 - 动态创建DataStore:在
getDataStore方法中,直接使用传入的fileKey作为DataStore的文件名。fileKey是Glance框架自动为每个Widget实例生成的唯一标识符,确保每个实例对应独立的存储文件。 - 保持getLocation的正确实现:
getLocation方法已经正确返回fileKey对应的文件路径,无需修改,它会与getDataStore中的配置保持一致。
这样修改后,每个Widget实例的状态都会存储在独立的DataStore文件中,不会再出现互相覆盖的问题,每个Widget的状态将独立维护。
内容的提问来源于stack exchange,提问作者ddxv
相关产品推荐
相关产品推荐

