使用Xamarin.Forms和Xamarin Studio进行基本存储

KJ3*_*KJ3 1 c# android xamarin.ios xamarin xamarin.forms

我一直在四处和周围小时,存储在Xarmarin.Forms PCL应用非常基本信息的一个看似简单的任务.我想做的就是让用户在Entry字段中输入一个东西,然后将其保存到Android和IOS设备.

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

And*_*per 5

使用共享PCL项目执行文件I/O比您预期的要复杂一点; 核心Xamarin Forms框架没有公开任何用于执行此操作的System.IO类,这可能会让您一开始感到困惑.如果你仔细想一想,它会产生一定的意义; 毕竟,每个平台都将拥有自己的I/O基础架构实现.但是,当你所要做的就是写一个哔哔的文件时,这并没有让你感到沮丧.

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

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

对于一个简单的项目,共享的PCL将没问题.在更复杂的项目中,我建议使用包含接口,共享类型等的专用"Common"程序集.在这种情况下,我们可以定义一个公开一些简单功能的接口:

using System;

namespace MyDemo
{
    public interface IFileService
    {
        void WriteData(String data);
        String ReadData();
    }
}
Run Code Online (Sandbox Code Playgroud)

接下来,我们将为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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

[assembly: Xamarin.Forms.Dependency(typeof(MyDemo.FileService))]
namespace MyDemo
{
    public class FileService : IFileService
    ...
Run Code Online (Sandbox Code Playgroud)

将Dependency属性放在名称空间声明之外是非常重要的; 即使你已经做了一切正确的事情,你仍然可以试着理解为什么你会得到空引用.

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

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

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

希望这可以帮助!