2017-04-19 69 views
0

我使用Xamarin表單來製作QR碼閱讀器應用程序。我發現了ZXing的一個實現,但由於在async函數之外使用關鍵字await而導致運行我的代碼時出現錯誤。然而,這個教程是這樣做的,但是我不知道我在做錯誤來拋出錯誤。Xamarin Forms 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打開掃描儀頁面)是OnAppearing方法創建掃描頁面,但是當掃描完成Navigation.PopAsync()小心被稱爲並調用MainPage上的OnAppearing。所以在這種情況下,新的掃描頁面將被推高。

1

此消息是因爲您需要將async關鍵字包含在運行您的方法的外部方法中。您遇到的問題是您正在嘗試在Page構造器上運行它,而這些不能是異步的。

你可以擺脫錯誤信息在頁面移動無論是pushAsyncPage方法調用了構造函數的另一種方法,如OnAppearing和改變這支增加異步的簽名,是這樣的:

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

如下評論,使用此代碼將需要具有可變知道該頁面已加載,以防止再次展示了從掃描儀返回時,在斑馬線上。

這就是我更喜歡在用戶迭代(點擊按鈕,輕掃或任何其他手勢)上打開掃描頁面以避免這種循環的原因。

祝你好運。

+0

當他從掃描頁面返回時,將調用MainPage上的OnAppearing並將新的scanPage推上。它的好場景? – puko

+0

@puko你是對的,沒有接受。它需要驗證用戶是否正在從掃描頁面返回。 – apineda