c# - 使用 Xamarin.Forms 和 Xamarin Studio 的基本存储

标签 c# android xamarin.ios xamarin xamarin.forms

为了在 Xarmarin.Forms PCL 应用程序中存储非常基本的信息这一看似简单的任务,我已经忙了好几个小时。我想要做的就是让用户在输入字段中输入一件事,然后将其保存到 Android 和 IOS 设备。

我看到的所有内容都无法在 Xamarin Studio 中工作(例如安装 nuget 包)。

最佳答案

使用共享 PCL 项目执行文件 I/O 比您预期的要复杂一些;核心 Xamarin Forms 框架没有公开任何用于执行此操作的 System.IO 类,这起初会让您感到非常困惑。如果您稍微考虑一下,它有一定的道理;毕竟,每个平台都会有自己的 I/O 基础设施实现。但是,当您只想写入一个 bleeping 文件时,这并不会减少您的沮丧。

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

DependencyService 框架有一个简单的方法:在程序集中定义一个接口(interface),它将被您的平台特定代码(Android、iOS、WinPhone 项目)引用,在平台特定的程序集中定义实现类,并注册具有 Dependency 属性的实现类(有关详细信息,请参阅 Xamarin Docs)。

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

using System;

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

接下来,我们将为我们的 Android 和 iOS 平台创建一个实现。创建一个实现该接口(interface)的类。重要的是它有一个无参数的构造函数,因为 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 属性放在 namespace 声明之外非常重要;你可能会挠头试图理解为什么你得到空引用,即使你显然已经做对了一切。

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

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

显然,您会想要比我的示例更高级的东西,但这应该能让您入门。

希望这对您有所帮助!

关于c# - 使用 Xamarin.Forms 和 Xamarin Studio 的基本存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26826370/

相关文章:

c# - LINQ 到 SQL : To Attach or Not To Attach

c# - 反转多个 XOR、ADD 函数

android - 突然报错 "user is not allowed to see this application per the developer set configuration"

android - 在 Android 和 iOS 上实现 React Native 推送通知的最可靠方法是什么

Xamarin Studio 更新后丢失智能感知,如何修复?

xamarin.ios - MonoTouch垃圾如何收集?

c# - 如何以编程方式将未知数量的下拉列表添加到页面并在提交时使用 C# 检索选定的值

c# - 有什么理由不使用标准 resx+static 绑定(bind)来本地化 WPF 吗?

java - 在 FragmentPagerAdapter 中设置图标和标题

iphone - root.plist 文件中的隐藏字段