使用Application.Current.Properties缓存数据在Xamarin.Forms中报错
作为有丰富Android开发经验的你,刚接触Xamarin.Forms想找类似SharedPreference的本地存储方案,却在使用Application.Current.Properties时遇到报错,这太正常了——我来帮你理清正确用法,还会给你更贴合SharedPreference使用习惯的替代方案!
先搞定Application.Current.Properties的正确打开方式
很多新手踩坑都是因为没注意它的核心细节:
1. 存储数据的正确步骤
Application.Current.Properties本质是内存中的字典,必须手动异步保存到本地,否则重启应用数据就会丢失,甚至可能触发报错:
// 1. 存入数据(支持string、int、bool等可序列化基本类型) Application.Current.Properties["IsFirstLaunch"] = true; Application.Current.Properties["UserAge"] = 28; Application.Current.Properties["UserName"] = "Wai Yan Hein"; // 2. 关键!异步保存到本地,一定要加await await Application.Current.SavePropertiesAsync();
2. 读取数据的安全姿势
直接读取不存在的Key会抛出KeyNotFoundException,一定要先判断Key是否存在:
// 方式1:用ContainsKey判断 if (Application.Current.Properties.ContainsKey("UserName")) { string userName = Application.Current.Properties["UserName"] as string; } // 方式2:用TryGetValue更安全 if (Application.Current.Properties.TryGetValue("UserAge", out var ageObj)) { int userAge = (int)ageObj; }
常见报错原因排查
- 忘记调用
SavePropertiesAsync():数据只在内存中,未持久化,重启后消失或保存逻辑报错 - 读取未存在的Key:直接取值导致KeyNotFound异常
- 存储不可序列化类型:比如自定义对象,需要先序列化为JSON字符串再存储
更贴合SharedPreference使用习惯的方案:Xamarin.Essentials Preferences
如果你觉得Application.Current.Properties的保存步骤太繁琐,推荐用Xamarin.Essentials的Preferences——它的设计几乎和Android的SharedPreference一致,无需手动保存,自动持久化,上手零成本:
基本用法
// 存储数据(支持string、int、bool、double等基本类型) Preferences.Set("IsFirstLaunch", true); Preferences.Set("UserName", "Wai Yan Hein"); // 读取数据,第二个参数是Key不存在时的默认值 bool isFirstLaunch = Preferences.Get("IsFirstLaunch", false); string userName = Preferences.Get("UserName", "Guest"); // 移除单个Key Preferences.Remove("UserAge"); // 清空所有存储的偏好设置 Preferences.Clear();
注意事项
- Xamarin.Essentials需要确保在各平台的项目中已安装NuGet包(一般新建Xamarin.Forms项目会默认包含)
- 存储的数据都是应用私有,和SharedPreference一样,其他应用无法访问
内容的提问来源于stack exchange,提问作者Wai Yan Hein
相关产品推荐
相关产品推荐

