首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xamarin.Forms DependencyService不能在文件处理中共享跨平台的接口。

Xamarin.Forms DependencyService不能在文件处理中共享跨平台的接口。
EN

Stack Overflow用户
提问于 2017-12-09 11:54:58
回答 1查看 576关注 0票数 0

我遵循官方Xamarin指南的跨平台文件处理使用.net-standard-2.0项目。该应用程序旨在为Android和Windows构建。

这给我提了个问题。接口代码如下所示。

代码语言:javascript
复制
public interface ISaveAndLoad {
    void SaveText (string filename, string text);
    string LoadText (string filename);
}

然而,给出的UWP代码被写成

代码语言:javascript
复制
[assembly: Dependency(typeof(SaveAndLoad_WinApp))]
namespace WindowsApp
{
    // https://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh758325.aspx
    public class SaveAndLoad_WinApp : ISaveAndLoad
    {
        public async Task SaveTextAsync(string filename, string text)
        {
            StorageFolder localFolder = ApplicationData.Current.LocalFolder;
            StorageFile sampleFile = await localFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
            await FileIO.WriteTextAsync(sampleFile, text);
        }
        public async Task<string> LoadTextAsync(string filename)
        {
            StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
            StorageFile sampleFile = await storageFolder.GetFileAsync(filename);
            string text = await Windows.Storage.FileIO.ReadTextAsync(sampleFile);
            return text;
        }
    }
}

代码不会编译,因为SaveAndLoad_WinApp没有实现接口ISaveAndLoad

我知道我可以将接口更改为TaskTask<string>,所以它将编译。

然而,问题可以追溯到Android。UWP使用的是安卓系统上不存在的Windows.Storage.FileIO。虽然安卓正在使用System.IO,但它没有一个可以等待的异步方法。这意味着我不能共享这个界面,因为UWP需要async Task<string>,但是Android只返回一个string而不是一个Task

如果我没有在UWP方法中使用async,那么FileIO将不会反过来工作。async void for SaveText运行良好,因为接口状态为void。但是,它不允许我为async string设置LoadText,因为异步方法必须返回Task<T>Taskvoid

看起来,在允许代码同步运行的同时,在Android上实现异步也是可行的。但是,我觉得我做错了什么,因为Xamarin示例显示它应该工作。

我在这里是误解了什么还是错过了一个实现?或者,在Xamarin文档中它实际上是错误的?

更新#1我为SaveText设置了一个async void,并意识到存在一个线程不需要等待的问题。它会快速转发到下一个函数。因此,我实际上必须等待功能在PCL的UWP。然而,安卓系统的实现是一个不容期待的void。所以它实际上导致了一个错误..。对于如何实现这个场景,有什么建议吗?

这是我在PCL中输入的代码

代码语言:javascript
复制
public static void Save(){
    DependencyService.Get<ISaveAndLoad>().SaveText("temp.txt", input.Text);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-10 06:20:38

代码不会编译,因为SaveAndLoad_WinApp没有实现接口ISaveAndLoad。

您可以下载文档示例WorkingWithFiles,可以找到它这里。在这个示例中,ISaveAndLoad接口有一点不同:

代码语言:javascript
复制
public interface ISaveAndLoad
{
    Task SaveTextAsync (string filename, string text);
    Task<string> LoadTextAsync (string filename);
    bool FileExists (string filename);
}

UWP使用的是安卓系统上不存在的Windows.Storage.FileIO。虽然安卓正在使用System.IO,但它没有一个可以等待的异步方法。

您可以在示例项目中引用Android.cs类,使用StreamWriter.WriteAsync()方法:

代码语言:javascript
复制
public class SaveAndLoad_Android : ISaveAndLoad
{
    #region ISaveAndLoad implementation

    public async Task SaveTextAsync (string filename, string text)
    {
        var path = CreatePathToFile (filename);
        using (StreamWriter sw = File.CreateText (path))
            await sw.WriteAsync(text);
    }

    public async Task<string> LoadTextAsync (string filename)
    {
        var path = CreatePathToFile (filename);
        using (StreamReader sr = File.OpenText(path))
            return await sr.ReadToEndAsync();
    }

    public bool FileExists(string filename)
    {
        return File.Exists(CreatePathToFile(filename));
    }

    #endregion

    string CreatePathToFile(string filename)
    {
        var docsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
        return Path.Combine(docsPath, filename);
    }
}

然后在您的PCL中,使用如下的SaveTextAsync方法:

代码语言:javascript
复制
var fileService = DependencyService.Get<ISaveAndLoad> ();
...
saveButton.Clicked += async (sender, e) => 
{
    loadButton.IsEnabled = saveButton.IsEnabled = false;
    // uses the Interface defined in this project, and the implementations that must
    // be written in the iOS, Android and WinPhone app projects to do the actual file manipulation

    await fileService.SaveTextAsync (fileName, input.Text);
    loadButton.IsEnabled = saveButton.IsEnabled = true;
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47728317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档