2017-04-19 16 views
0

私はQRコードリーダーアプリケーションを作成するためにXamarinフォームを使用しています。私はZXingによる実装を見つけましたが、async機能の外でawaitキーワードを使用しているため、コードを実行しているときにエラーが発生しています。チュートリアルではこのようにしていますが、エラーをスローするために間違っていることはわかりません。XamarinフォームZXing QRコードエラー

using Xamarin.Forms; 
using ZXing.Net.Mobile.Forms; 

namespace App3 
{ 
    public partial class MainPage : ContentPage 
    { 
     public MainPage() 
     { 
      InitializeComponent(); 

      var scanPage = new ZXingScannerPage(); 
      scanPage.OnScanResult += (result) => { 
       // Stop scanning 
       scanPage.IsScanning = false; 

       // Pop the page and show the result 
       Device.BeginInvokeOnMainThread(() => { 
        Navigation.PopAsync(); 
        DisplayAlert("Scanned Barcode", result.Text, "OK"); 
       }); 
      }; 

      // Navigate to our scanner page 
      await Navigation.PushAsync(scanPage); // Here is the error 
     } 
    } 
} 

エラーは次のとおりです。

The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'

答えて

2

コンストラクタは非同期でカントので、それはあります。ただ、無効するようにコードを移動する方法のように:

private async void InitializeScanner() 
{ 
    var scanPage = new ZXingScannerPage(); 
     scanPage.OnScanResult += (result) => { 
      // Stop scanning 
      scanPage.IsScanning = false; 

      // Pop the page and show the result 
      Device.BeginInvokeOnMainThread(() => { 
       Navigation.PopAsync(); 
       DisplayAlert("Scanned Barcode", result.Text, "OK"); 
      }); 
     }; 

     // Navigate to our scanner page 
     await pushAsyncPage(scanPage); 
} 

public MainPage() 
{ 
    InitializeComponent(); 
    InitializeScanner(); 
} 

(いくつかの調整がボタンcllickにスキャナページを開くEGと)と呼ばれているOnAppearing方法でスキャンページを作成しますが、スキャンがNavigation.PopAsync()を完了したときに注意が必要であるもう一つの選択肢かもしれない、より良いですあなたのMainPageのOnAppearingが呼び出されます。その場合、新しいスキャンページがプッシュアップされます。

1

このメッセージは、メソッドを実行している外部メソッドにasyncキーワードを含める必要があるためです。あなたが持っている問題は、ページコンストラクタでそれを実行しようとしており、これらが非同期ではないことです。

あなたはOnAppearingのようなページ内の別のメソッドにコンストラクタのうちのいずれかpushAsyncPageメソッド呼び出しを移動するエラーメッセージを取り除くと、この追加非同期の署名を変更する、のようなものを取得することができます

protected override async void OnAppearing() 
    { 
     base.OnAppearing(); 

     if(isPageLoaded) 
      return; 

     isPageLoaded = true; 
     await pushAsyncPage(scanPage); 
    } 

または、コード全体を同じ方法に移動する:

protected override async void OnAppearing() 
    { 
     base.OnAppearing(); 

     if(isPageLoaded) 
      return; 

     isPageLoaded = true; 

     var scanPage = new ZXingScannerPage(); 
     scanPage.OnScanResult += (result) => { 
      // Stop scanning 
      scanPage.IsScanning = false; 

      // Pop the page and show the result 
      Device.BeginInvokeOnMainThread(() => { 
       Navigation.PopAsync(); 
       DisplayAlert("Scanned Barcode", result.Text, "OK"); 
      }); 
     }; 

     // Navigate to our scanner page 
     await pushAsyncPage(scanPage); // Here is the error    
    } 

これで十分です。

UPDATE

としては、ページがすでにスキャナからの復帰時、再び示すZXingページを防ぐためにロードされているかどうかを知るために、変数を持つ必要があります。このコードを使用して、下記のコメントしています。

これは、このようなループを防ぐために、ユーザーの繰り返し(ボタンをタップ、スワイプまたは他のジェスチャをタップ)でスキャンページを開くことをお勧めします。

幸運。

+0

スキャンページから戻ったときMainPageで出現すると新しいscanPageがプッシュアップされます。その良いシナリオ? – puko

+0

@pukoあなたは正しいです、それをキャッチしませんでした。ユーザーがスキャンページから戻るかどうかを確認する必要があります。 – apineda

関連する問題