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

