.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;
}
}
}
コードとして書かれています。
私はTask
とTask<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 string
をTask<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);
}