Xamarin Forms Sharedpreferences 交叉

Posted

技术标签:

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

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

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

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

这是正确的做法吗?

【问题讨论】:

【参考方案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】:
    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/

    使用本机设置管理的 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() 之类的异步实现?

以上是关于Xamarin Forms Sharedpreferences 交叉的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms 手势密码实现

Xamarin.Forms 和 Xamarin Native 有啥区别? [关闭]

如何使用 Xamarin.Forms.Maps(无 Xamarin.Forms.GoogleMaps)在地图中应用样式或更改颜色

Xamarin Forms Prism:prism ResourceDictionary 中已存在具有键“Xamarin.Forms.NavigationPage”的资源

Xamarin.Forms.Forms.Init(e) Onlaunched 中的 FileNotFoundExeception

如果调用方未使用 Xamarin.Forms,Xamarin 依赖项服务能否正常工作?