0

.net-standard-2.0 PCLプロジェクトを使用して、クロスプラットフォームファイル処理のためにofficial Xamarin guideに従っています。このアプリは、AndroidとWindows向けに構築されています。Xamarin.Formsファイル処理でクロスプラットフォームのインターフェイスを共有できません

ここで私に質問があります。インタフェースコードは以下の通りです。

public interface ISaveAndLoad { 
    void SaveText (string filename, string text); 
    string LoadText (string filename); 
} 

しかし、UWPために与えられたコードは、インタフェース​​を実装していないSaveAndLoad_WinAppとしてコンパイルされません

[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; 
     } 
    } 
} 

コードとして書かれています。

私はTaskTask<string>にインターフェイスを変更できますので、コンパイルすることができます。

しかし、問題はAndroidに戻ります。 UWPはこのWindows.Storage.FileIOをAndroidには使用していません。 AndroidはSystem.IOを使用していますが、待つことができるAsyncメソッドはありません。つまり、私はUWPがasync Task<string>が必要なのでインターフェイスを共有できませんが、AndroidはTaskの代わりにstringを返します。

UWPメソッドでasyncを使用しない場合は、FileIOは機能しません。 のasync voidは、インターフェイス状態voidとして正常に動作します。ただし、非同期メソッドとしてのasync stringTask<T>,Taskまたはvoidに戻す必要があります。

コードを同期させながらAndroidにもasyncを実装する方法があるようです。しかし、Xamarinのサンプルが動作するはずであることを示しているので、何か間違ったことをしたような気がします。

ここで何かを誤解しているか、実装が不足していますか?それともXamarinのドキュメントで実際に間違っていますか?


UPDATE#1 私はSaveTextためasync voidを入れて、スレッドが待たれていない問題があることを認識しています。それは速く次の機能に転送されました。だから私は実際にUWPのためのPCLの機能を待たなければならない。しかし、Androidでの実装は、待つことができないvoidです。実際にはエラーが発生しています。 このシナリオを実装する方法はありますか?ここで

は、私はSaveAndLoad_WinAppは、インタフェースISaveAndLoadを実装していないように、コードがコンパイルされません私のPCL

public static void Save(){ 
    DependencyService.Get<ISaveAndLoad>().SaveText("temp.txt", input.Text); 
} 

答えて

0

に入れたコードです。

ドキュメントサンプルWorkingWithFilesをダウンロードできます。hereが見つかりました。このサンプルではISaveAndLoadインターフェースはほとんど差があります

public interface ISaveAndLoad 
{ 
    Task SaveTextAsync (string filename, string text); 
    Task<string> LoadTextAsync (string filename); 
    bool FileExists (string filename); 
} 

UWPは、Android上に存在しないこのWindows.Storage.FileIOのものを使用しています。 AndroidはSystem.IOを使用していますが、待つことができるAsyncメソッドはありません。

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; 
}; 
:このような SaveTextAsyncメソッドを使用し、あなたの PCLに続いて

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); 
    } 
} 

あなたは使用し、サンプルプロジェクトにSaveAndLoad_Android.csクラスにStreamWriter.WriteAsync()メソッドを参照することができます

関連する問題