android - 在 Jetpack Compose 中显示 DataStore protobuf 设置
问题描述
我在尝试在 Jetpack Compose 中启动时显示保存在我的 DataStore 中的数据时遇到问题。
我有一个使用协议缓冲区序列化数据的数据存储集。我创建数据存储
val Context.networkSettingsDataStore: DataStore<NetworkSettings> by dataStore(
fileName = "network_settings.pb",
serializer = NetworkSettingsSerializer
)
并将其转换为视图模型中的 livedata 对象
val networkSettingsLive = dataStore.data.catch { e ->
if (e is IOException) { // 2
emit(NetworkSettings.getDefaultInstance())
} else {
throw e
}
}.asLiveData()
然后在我的@Composable 中,我尝试观察这些数据 asState
@Composable
fun mycomposable(viewModel: MyViewModel) {
val networkSettings by viewModel.networkSettingsLive.observeAsState(initial = NetworkSettings.getDefaultInstance())
val address by remember { mutableStateOf(networkSettings.address) }
Text(text = address)
}
我已经确认数据在数据存储中,并且正确保存。我已经将一些打印语句放入可组合文件中,并且数据存储中的数据最终会生成它,但从未真正显示在我的视图中。我想说我没有以正确的方式正确地将我的数据设置为有状态,但我认为它也可能不是以正确的方式从数据存储中读取。是否在可组合中显示来自数据存储的数据,同时显示启动时的初始数据以及实时更改?
解决方案
我已经想通了。我必须做的是在可组合中定义状态变量,然后通过视图模型中的状态控制变量设置它们,然后在初始化后的某个时间使用 dataStore 中的内容设置该变量。
class MyActivity(): Activity {
private val viewModel: MyViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
MainScope.launch {
val networkSettings = viewModel.networkSettingsFlow.firstOrNull()
if (networkSettings != null) {
viewModel.mutableNetworkSettings.value = networkSettings
}
}
}
}
class MyViewModel(): ViewModel {
val networkSettingsFlow = dataStore.data
val mutableNetworkSettings = mutableStateOf(NetworkSettings.getInstance()
}
@Composable
fun NetworkSettings(viewModel: MyViewModel) {
val networkSettings by viewModel.mutableNetworkSettings
var address by remember { mutableStateOf(networkSettings.address) }
address = networkSettings.address
Text(text = address)
}
推荐阅读
- apache-spark - 是否可以在火花中加入 TempView,因为它正在抛出无法解决符号错误
- javascript - 无法使用 express-unless 免除一些路由的身份验证
- c - 检查 docker alpine musl 版本
- java - 在 EditText 中键入时为文本添加下划线 - Android
- node.js - 无法创建反应应用,发现 1 个低严重性漏洞
- javascript - 如何从 React Native 中的 Reference 数据类型获取 Firebase Firestore 中的数据
- c++ - 输出的简单重定向与实现记录器
- asp.net-core - 为什么 Newtonsoft [JsonIgnore] 停止在 asp core mvc 中工作
- regex - 16位身份证的正则表达式如何写,规则如下?
- javascript - 为什么 obj.constructor.prototype 并不总是等于 obj.__proto__?