【问题标题】:Show DataStore protobuf settings in Jetpack Compose在 Jetpack Compose 中显示 DataStore protobuf 设置
【发布时间】:2021-08-17 13:59:49
【问题描述】:

我在尝试在 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 中我尝试观察这些数据作为状态

@Composable
fun mycomposable(viewModel: MyViewModel) {
    val networkSettings by viewModel.networkSettingsLive.observeAsState(initial = NetworkSettings.getDefaultInstance())
    val address by remember { mutableStateOf(networkSettings.address) }
    Text(text = address)
}

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

【问题讨论】:

    标签: android user-interface state android-jetpack-compose datastore


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 2021-04-26
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多