设置允许将配置应用程序行为的数据与代码分离,允许在不重新构建应用程序的情况下更改行为。有两种类型的设置:应用设置和用户设置。
应用设置是应用程序创建和管理的数据。它可以包括固定Web服务端点,API密钥和运行时状态等数据。应用设置与应用的存在有关,只对该应用有意义。
用户设置是影响应用行为的应用的可自定义设置,不需要频繁的重新调整。例如,应用程序可能会让用户指定从哪里检索数据,以及如何在屏幕上显示数据。
Xamarin.Forms包含可用于存储设置数据的持久字典。可以使用Application.Current.Properties属性访问此字典,并且在应用进入睡眠状态时保存放入其中的任何数据,并在应用程序恢复或重新启动时恢复。此外,Application类还具有一个SavePropertiesAsync方法,允许应用程序在需要时保存其设置。有关此字典的更多信息,请参阅Xamarin开发人员中心的属性字典。
使用Xamarin.Forms持久性字典存储数据的缺点是它不容易被数据绑定。因此,eShopOnContainers手机应用程序使用可从NuGet获取的Xam.Plugins.Settings库。在使用每个平台提供的本地设置管理的同时,该库提供一致的,类型安全的跨平台方法,用于持久化和检索应用程序和用户设置。此外,使用数据绑定访问库公开的设置数据是直接的。
注意:虽然Xam.Plugin.Settings库可以存储应用程序和用户设置,但两者之间没有区别。
创建一个设置类
当使用Xam.Plugins.Settings库时,应创建一个静态类,该类将包含应用程序所需的应用程序和用户设置。 以下代码示例显示了eShopOnContainers移动应用程序中的Settings类:
点击(此处)折叠或打开
- public static class Settings
- {
- private static ISettings AppSettings
- {
- get
- {
- return CrossSettings.Current;
- }
- }
- ...
- }
可以通过由Xam.Plugins.Settings库提供的ISettings API读取和写入设置。 该库提供了一个可用于访问API的单例,CrossSettings.Current,应用程序的设置类应通过ISettings属性公开此单例。
注意:使用Plugin.Settings和Plugin.Settings.Abstractions命名空间的指令应该添加到需要访问Xam.Plugins.Settings库类型的类中。
添加设置
每个设置由一个键,一个默认值和一个属性组成。 以下代码示例显示了用于设置eShopOnContainers移动应用程序连接到的在线服务的基本URL的用户设置的所有三个项目:
点击(此处)折叠或打开
- public static class Settings
- {
- ...
- private const string IdUrlBase = "url_base";
- private static readonly string UrlBaseDefault = GlobalSetting.Instance.BaseEndpoint;
- ...
-
- public static string UrlBase
- {
- get
- {
- return AppSettings.GetValueOrDefaultstring>(IdUrlBase, UrlBaseDefault);
- }
- set
- {
- AppSettings.AddOrUpdateValuestring>(IdUrlBase, value);
- }
- }
- }
键始终是定义键名称的常量字符串,设置的默认值是所需类型的静态可读值。 如果检索到未设置的设置,则提供默认值可确保有效值可用。
UrlBase static属性使用ISettings API中的两个方法来读取或写入设置值。 ISettings.GetValueOrDefault方法用于从平台特定的存储中检索设置的值。 如果没有为该设置定义值,则会检索其默认值。 类似地,ISettings.AddOrUpdateValue方法用于将设置的值持续到平台特定的存储。
而是在Settings类中定义默认值,UrlBaseDefault字符串从GlobalSetting类获取其值。 以下代码示例显示了此类中的BaseEndpoint属性和UpdateEndpoint方法:
点击(此处)折叠或打开
- public class GlobalSetting
- {
- ...
- public string BaseEndpoint
- {
- get { return _baseEndpoint; }
- set
- {
- _baseEndpoint = value;
- UpdateEndpoint(_baseEndpoint);
- }
- }
- ...
-
- private void UpdateEndpoint(string baseEndpoint)
- {
- RegisterWebsite = string.Format("{0}:5105/Account/Register", baseEndpoint);
- CatalogEndpoint = string.Format("{0}:5101", baseEndpoint);
- OrdersEndpoint = string.Format("{0}:5102", baseEndpoint);
- BasketEndpoint = string.Format("{0}:5103", baseEndpoint);
- IdentityEndpoint = string.Format("{0}:5105/connect/authorize", baseEndpoint);
- UserInfoEndpoint = string.Format("{0}:5105/connect/userinfo", baseEndpoint);
- TokenEndpoint = string.Format("{0}:5105/connect/token", baseEndpoint);
- LogoutEndpoint = string.Format("{0}:5105/connect/endsession", baseEndpoint);
- IdentityCallback = string.Format("{0}:5105/xamarincallback", baseEndpoint);
- LogoutCallback = string.Format("{0}:5105/Account/Redirecting", baseEndpoint);
- }
- }
每次设置BaseEndpoint属性时,都会调用UpdateEndpoint方法。 此方法更新一系列属性,所有这些属性都基于由“设置”类提供的UrlBase用户设置,这些设置表示eShopOnContainers移动应用程序连接到的不同端点。
数据绑定到用户设置
在eShopOnContainers手机应用程序中,SettingsView显示两个用户设置。 这些设置允许配置应用程序是否从部署为Docker容器的微服务中检索数据,还是应用程序是否应从不需要Internet连接的模拟服务中检索数据。 当选择从容器化的微服务检索数据时,必须指定微服务器的基本端点URL。 图7-1显示了用户选择从容器式微服务检索数据时的SettingsView。
图7-1:eShopOnContainers手机应用程序公开的用户设置
数据绑定可用于检索和设置Settings类公开的设置。 这是通过对视图绑定的控件实现的,该视图绑定到查看模型属性,反过来访问“设置”类中的属性,并且如果设置值已更改则提高属性已更改的通知。 有关eShopOnContainers移动应用程序如何构建视图模型并将其与视图关联的信息,请参阅使用视图模型定位器自动创建视图模型。
以下代码示例显示了来自SettingsView的Entry控件,允许用户输入集装式微服务的基本端点URL:
点击(此处)折叠或打开
- Entry Text="{Binding Endpoint, Mode=TwoWay}" />
此Entry控件使用双向绑定绑定到SettingsViewModel类的Endpoint属性。 以下代码示例显示了Endpoint属性:
点击(此处)折叠或打开
- public string Endpoint
- {
- get { return _endpoint; }
- set
- {
- _endpoint = value;
-
- if(!string.IsNullOrEmpty(_endpoint))
- {
- UpdateEndpoint(_endpoint);
- }
-
- RaisePropertyChanged(() => Endpoint);
- }
- }
当Endpoint属性被设置时,调用UpdateEndpoint方法,前提是提供的值是有效的,并且引发了属性更改的通知。 以下代码示例显示UpdateEndpoint方法:
点击(此处)折叠或打开
- private void UpdateEndpoint(string endpoint)
- {
- Settings.UrlBase = endpoint;
- }
此方法使用用户输入的基本端点URL值更新Settings类中的UrlBase属性,从而使其保持平台特定的存储。
当SettingsView导航到,SettingsViewModel类中的InitializeAsync方法被执行。 以下代码示例显示了此方法:
点击(此处)折叠或打开
- public override Task InitializeAsync(object navigationData)
- {
- ...
- Endpoint = Settings.UrlBase;
- ...
- }
该方法将Endpoint属性设置为Settings类中UrlBase属性的值。 访问UrlBase属性会导致Xam.Plugins.Settings库从平台特定的存储中检索设置值。 有关如何调用InitializeAsync方法的信息,请参阅在导航期间传递参数。
该机制确保每当用户导航到SettingsView时,将从平台特定的存储中检索用户设置,并通过数据绑定进行呈现。 然后,如果用户更改设置值,数据绑定将确保它们立即保留回平台特定的存储。
概要
设置允许将配置应用程序行为的数据与代码分离,允许在不重新构建应用程序的情况下更改行为。 应用程序设置是应用程序创建和管理的数据,用户设置是影响应用程序行为的应用程序的可自定义设置,不需要频繁重新调整。
Xam.Plugins.Settings库提供一致的,类型安全的跨平台方法,用于持久化和检索应用程序和用户设置,数据绑定可用于访问使用库创建的设置。