首页 > 解决方案 > 在 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)
}

我已经确认数据数据存储中,并且正确保存。我已经将一些打印语句放入可组合文件中,并且数据存储中的数据最终会生成它,但从未真正显示在我的视图中。我想说我没有以正确的方式正确地将我的数据设置为有状态,但我认为它也可能不是以正确的方式从数据存储中读取。是否在可组合中显示来自数据存储的数据,同时显示启动时的初始数据以及实时更改?

标签: androiduser-interfacestateandroid-jetpack-composedatastore

解决方案


我已经想通了。我必须做的是在可组合中定义状态变量,然后通过视图模型中的状态控制变量设置它们,然后在初始化后的某个时间使用 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)
}

推荐阅读