使用Xamarin.Forms和XamarinStudio的基本存储

本文关键字:存储 XamarinStudio Xamarin Forms 使用 | 更新日期: 2023-09-27 18:29:48

几个小时以来,我一直在处理一项看似简单的任务,即在Xarmarin.Forms PCL应用程序中存储非常基本的信息。我只想让用户在Entry字段中输入一件事,然后将其保存到Android和IOS设备中。

我看到的一切我都无法在Xamarin Studio中工作(比如安装nuget包)。

使用Xamarin.Forms和XamarinStudio的基本存储

使用共享PCL项目执行文件I/O比您预期的要复杂一些;核心Xamarin Forms框架没有公开任何用于实现这一点的System.IO类,这可能会让您一开始感到非常困惑。如果你仔细想想,它是有一定意义的;毕竟,每个平台都将有自己的I/O基础设施实现。然而,当你只想写一个哔哔作响的文件时,这并没有减轻你的沮丧。

这就是DependencyService的用武之地!Xamarin Forms框架的设计者明白,人们希望在共享程序集中编写代码,但仍然需要访问特定于平台的实现,例如低级文件访问。为了支持这个用例,Xamarin Forms公开了一个类似MEF的依赖注入框架,它允许您通过属性注册接口的实现。

DependencyService框架有一个简单的配方:在程序集中定义一个接口,该接口将被特定于平台的代码(Android、iOS、WinPhone项目)引用,在特定于平台程序集中定义实现类,并使用Dependency属性注册实现类(有关更多信息,请参阅Xamarin文档)。

对于一个简单的项目,共享PCL就可以了。在更复杂的项目中,我建议使用一个包含接口、共享类型等的专用"Common"程序集。在这种情况下,我们可以定义一个暴露一些简单功能的接口:

using System;
namespace MyDemo
{
    public interface IFileService
    {
        void WriteData(String data);
        String ReadData();
    }
}

接下来,我们将为我们的Android和iOS平台创建一个实现。创建一个实现接口的类。它有一个无参数的构造函数是很重要的,因为DependencyService目前没有提供传递任何构造函数参数的方法:

namespace MyDemo
{
    public class FileService : IFileService
    {
        public FileService()
        {
        }
        public void WriteData(String data)
        {
            string filePath = Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.Personal),
            "Data.txt");
            System.IO.File.WriteAllText(filePath, data);
        }
        public String ReadData()
        {
            string filePath = Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.Personal),
            "Data.txt");
            var data = System.IO.File.ReadAllText(filePath);
            return data;
        }
    }
}

最后,添加一个导出此实现的属性:

[assembly: Xamarin.Forms.Dependency(typeof(MyDemo.FileService))]
namespace MyDemo
{
    public class FileService : IFileService
    ...

将Dependency属性放置在命名空间声明之外是非常重要的;你可能会挠头,试图理解为什么你得到了空引用,尽管你显然做得很好。

最后,在共享项目的代码中,使用DependencyService在运行时解析实现:

var fileService = DependencyService.Get<IFileService>();
fileService.WriteData("Hello!");
var data = fileService.ReadData();
System.Diagnostics.Debug.WriteLine(data);

显然,你会想要比我的例子更高级的东西,但这应该让你开始。

希望这能有所帮助!

Charles Petzold在他的电子书《使用Xamarin创建移动应用程序》中也为使用DependencyService的所有三个平台编写了大量关于文件助手的代码。Forms