【问题标题】:Xamarin Forms Sharedpreferences crossXamarin Forms Sharedpreferences 交叉
【发布时间】:2015-11-22 23:51:58
【问题描述】:

我想知道以跨平台方式操作应用程序设置的最佳解决方案是什么。

在 iOS 中,我们可以在设置屏幕中更改应用程序外部的设置,但在 windows phone 和 android 中我们没有。

所以,我的想法是在应用程序中创建一个普通页面/屏幕,显示我的所有应用程序设置,并具有一个带有 Save() 和 Get() 方法的接口,我可以使用 DependencyServices 为每个设备实现特定的方法。

这是正确的做法吗?

【问题讨论】:

    标签: sharedpreferences cross-platform xamarin.forms application-settings


    【解决方案1】:

    我尝试使用 Application.Current.Properties Dictionary 并遇到了实现问题。

    James Montemagno 的 Xam.Plugin.Settings NuGet 是一个非常简单的解决方案。 GitHub 安装 NuGet 会自动创建一个带有 Settings.cs 的 Helpers 文件夹。要创建持久设置,您需要:

        private const string QuestionTableSizeKey = "QuestionTableSizeKey";
        private static readonly long QuestionTableSizeDefault = 0;
    

        public static long QuestionTableSize
        {
            get
            {
                return AppSettings.GetValueOrDefault<long>(QuestionTableSizeKey, QuestionTableSizeDefault);
            }
            set
            {
                AppSettings.AddOrUpdateValue<long>(QuestionTableSizeKey, value);
            }
        }
    

    应用程序中的访问和设置如下所示:

    namespace XXX
    {
        class XXX
        {
            public XXX()
            {
                    long myLong = 495;
                    ...
                    Helpers.Settings.QuestionTableSize = myLong;
                    ...
                    long oldsz = Helpers.Settings.QuestionTableSize;                   
            }
        }
    
    }
    

    【讨论】:

      【解决方案2】:
      1. Application 子类有一个静态属性字典,可用于存储数据。可以使用 Application.Current.Properties 从 Xamarin.Forms 代码中的任何位置访问它。
      Application.Current.Properties ["id"] = someClass.ID;
      
      if (Application.Current.Properties.ContainsKey("id"))
      {
          var id = Application.Current.Properties ["id"] as int;
          // do something with id
      }
      

      属性字典会自动保存到设备中。当应用程序从后台返回时,甚至在重新启动后,添加到字典中的数据都将可用。 Xamarin.Forms 1.4 在 Application 类上引入了一个附加方法 - SavePropertiesAsync() - 可以调用该方法来主动保留 Properties 字典。这是为了让您在重要更新后保存属性,而不是冒着由于崩溃或被操作系统杀死而无法序列化它们的风险。

      https://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/app-lifecycle/

      1. 使用本机设置管理的 Xamarin.Forms 插件。

        • Android:共享首选项
        • iOS:NSUserDefaults
        • Windows Phone:独立存储设置
        • Windows 应用商店/Windows Phone RT:ApplicationDataContainer

      https://github.com/jamesmontemagno/Xamarin.Plugins/tree/master/Settings

      【讨论】:

      • 感谢您的帮助。只是一件事,如果我想在 iOS 中的应用程序之外以及在应用程序的其他平台中进行设置?那我需要按照我之前说的去做吧?因为更具体,所以如果 Device.OS != iOS,我可以在应用程序中注入或不注入设置屏幕
      • 是的,您需要检查 Device.OS 并启用/禁用设置页面。要在应用程序之外进行设置(设置菜单),您需要使用第二种原生方法,并且不要忘记添加 Settings.Bundle (useyourloaf.com/blog/…)
      • 对于诸如字符串、整数或任何其他简单数据结构的设置,我真的推荐我的设置插件。我在所有应用程序中都使用它超过 4 年,它保存到 Daniel 说的本地管理系统中。此外,它适用于使用 Xamarin.Forms 或传统构建的每种类型的应用程序。我今天早上刚做了一个现场录音:youtube.com/watch?v=VNPLxeq9ZII&feature=youtu.be
      • @DanielLuberda,我想在我的 iOS CustomRenderer 类中调用Application.Current.Properties ["id"] 值,但它显示Application doesn't contain a definition for Current。我可以在 Android CustomRenderer 类中使用它。它在 Android 中运行良好。
      • @JamesMontemagno 您是否计划在 Xamarin.Forms 1.4 中使用诸如 SavePropertiesAsync() 之类的异步实现?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多