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

Android中ViewModel/Model布尔值无法保存问题求助

问题排查与解决方案

1. 修复Jackson序列化/反序列化的字段映射问题

你的User类里的布尔字段只加了@JsonDeserialize用于反序列化,但没处理序列化时的字段名匹配。Jackson对is开头的布尔字段有默认规则——序列化时会自动去掉is前缀(比如isBreeder会变成breeder),导致存到SharedPreferences的JSON里字段名和类里的字段名对不上,反序列化时找不到对应值,只能用默认的false。

解决办法:给每个布尔字段加上@JsonProperty注解,明确指定JSON里的字段名,确保序列化和反序列化的字段完全一致:

@JsonProperty("isBreeder")
@JsonDeserialize(using = NumericBooleanDeserializer::class)
var isBreeder: Boolean = false,

@JsonProperty("autoShare")
@JsonDeserialize(using = NumericBooleanDeserializer::class)
var autoShare: Boolean = false,

@JsonProperty("isSearching")
@JsonDeserialize(using = NumericBooleanDeserializer::class)
var isSearching: Boolean = false,

@JsonProperty("hasDog")
@JsonDeserialize(using = NumericBooleanDeserializer::class)
var hasDog: Boolean = false,

2. 确认LocationProximityFragment正确读取SharedPreferences数据

看你的代码,LocationProximityFragment直接用了viewModel.user,但没看到从SharedPreferences加载数据的逻辑。要在Fragment初始化时调用getUserPref()更新viewModel里的User对象:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    // 从SharedPreferences读取并更新viewModel的user实例
    viewModel.user = getUserPref()
    Log.d(TAG, "onCreate: ${viewModel.user.isBreeder}, ${viewModel.user.autoShare}")
    initViews()
    setOnClickListener()
}

3. 调试序列化后的JSON内容

在setUserPref方法里加日志,打印序列化后的JSON字符串,确认布尔值是否被正确序列化:

fun setUserPref(user: User) {
    val userString = mapper.writeValueAsString(user)
    Log.d("SHARED_PREF_DEBUG", "序列化后的User: $userString") // 检查JSON里布尔字段的实际值
    setStringPref(PREF_USER, userString)
}

如果JSON里没有这些布尔字段或者值是false,问题出在序列化环节;如果JSON里值是true,那问题就出在反序列化或者Fragment读取数据的逻辑上。

额外提示:@JsonInclude注解的影响

你的User类用了@JsonInclude(JsonInclude.Include.NON_NULL),但布尔类型是基本数据类型,不会为null,所以当字段值为默认的false时不会被序列化,但设置为true时应该会被包含。如果序列化后的JSON还是缺这些字段,可以试试把注解改成@JsonInclude(JsonInclude.Include.NON_DEFAULT),确保非默认值的字段都能被序列化。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:05:10