本文共 5604 字,大约阅读时间需要 18 分钟。
每个程序员都知道应该将可重用的代码放在库中,对于依赖服务使用的代码也是如此。这里开发的异步文件I / O函数将在第24章的NoteTaker程序中重用,您可能希望在自己的应用程序中使用这些函数,或者开发自己的函数。
但是,这些文件I / O类不能只放在一个库中。 FileHelper的各种平台实现必须位于该特定平台的库中。这需要为每个平台分别创建库。本书可下载代码的Libraries目录包含一个名为Xamarin.FormsBook.Platform的解决方案。该名称的平台部分受到各种Xamarin.Forms.Platform库的启发。各种平台中的每一个都是此解决方案中的独立库。Xamarin.FormsBook.Platform解决方案包含不少于七个库项目,每个项目的创建方式都有所不同:您还需要在解决方案中的各个项目之间建立引用。 所有单个平台项目(Xamarin.FormsBook.Platform.WinRT除外)都需要引用Xamarin.FormsBook.Platform。 您可以通过选择左侧的Solution在Reference Manager对话框中设置这些引用。 此外,三个Windows项目(UWP,Windows和WinPhone)都需要引用共享的Xamarin.FormsBook.Platform.WinRT项目。 通过选择左侧的“共享项目”,可以在“参考管理器”对话框中设置这些引用
所有项目都有一个静态的Toolkit.Init方法。 这是Xamarin.Forms中的一个?Book.Platform库:namespace Xamarin.FormsBook.Platform{ public static class Toolkit { public static void Init() { } }}
除了Android库中的版本实际上保存了一些可能对此库中实现的类有用的信息之外,其他大多数都是相似的:
namespace Xamarin.FormsBook.Platform.Android{ public static class Toolkit { public static void Init(Activity activity, Bundle bundle) { Activity = activity; } public static Activity Activity { private set; get; } }}
每个Windows平台中的Toolkit.Init方法都调用do-nothing Toolkit.Init
共享Xamarin.FormsBook.Platform.WinRT项目中的方法:namespace Xamarin.FormsBook.Platform.UWP{ public static class Toolkit { public static void Init() { Xamarin.FormsBook.Platform.WinRT.Toolkit.Init(); } }}
这些方法的目的是确保库绑定到应用程序,即使应用程序不直接访问库中的任何内容。 当您使用依赖服务和自定义渲染器时,应用程序不会直接调用任何库函数。 但是,如果您稍后发现确实需要执行某些库初始化,则此方法已存在。
您将发现本书可下载代码中包含的Xamarin.FormsBook.Platform库的版本已包含第9章“特定于平台的API调用”中的PlatformSoundPlayer类。您还将看到一些以 单词Ellipse和StepSlider。 这些将在第27章“自定义渲染器”中讨论。让我们关注新的异步FileHelper类。 Xamarin.FormsBook.Platform库包含新的IFileHelper接口:using System.Collections.Generic;using System.Threading.Tasks;namespace Xamarin.FormsBook.Platform{ public interface IFileHelper { TaskExistsAsync(string filename); Task WriteTextAsync(string filename, string text); Task ReadTextAsync(string filename); Task > GetFilesAsync(); Task DeleteAsync(string filename); }}
按照惯例,返回Task对象的方法的后缀为Async。
所有三个Windows平台都可以共享相同的FileHelper类,因此这个共享类是在共享的Xamarin.FormsBook.Platform.WinRT项目中实现的。 FileHelper类中的五个方法中的每一个都以调用来开始,以获取与应用程序的本地存储区域关联的StorageFolder。 它们中的每一个都使用await进行异步调用,并使用async关键字进行标记:using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using Windows.Storage;using Xamarin.Forms;[assembly: Dependency(typeof(Xamarin.FormsBook.Platform.WinRT.FileHelper))]namespace Xamarin.FormsBook.Platform.WinRT{ class FileHelper : IFileHelper { public async TaskExistsAsync(string filename) { StorageFolder localFolder = ApplicationData.Current.LocalFolder; try { await localFolder.GetFileAsync(filename); } catch { return false; } return true; } public async Task WriteTextAsync(string filename, string text) { StorageFolder localFolder = ApplicationData.Current.LocalFolder; IStorageFile storageFile = await localFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting); await FileIO.WriteTextAsync(storageFile, text); } public async Task ReadTextAsync(string filename) { StorageFolder localFolder = ApplicationData.Current.LocalFolder; IStorageFile storageFile = await localFolder.GetFileAsync(filename); return await FileIO.ReadTextAsync(storageFile); } public async Task > GetFilesAsync() { StorageFolder localFolder = ApplicationData.Current.LocalFolder; IEnumerable filenames = from storageFile in await localFolder.GetFilesAsync() select storageFile.Name; return filenames; } public async Task DeleteAsync(string filename) { StorageFolder localFolder = ApplicationData.Current.LocalFolder; StorageFile storageFile = await localFolder.GetFileAsync(filename); await storageFile.DeleteAsync(); } }}
你的支持是我继续的动力啊。
转载地址:http://anboa.baihongyu.com/