Xamarin表示ZXing QR码错误

时间:2017-04-19 04:16:41

标签: c# asynchronous xamarin xamarin.forms

我使用Xamarin表单制作QR码阅读器应用程序。我找到了ZXing的一个实现,但由于在await函数之外使用async关键字,我在运行代码时遇到错误。然而,教程以这种方式实现,但我不知道我错误地抛出错误。

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 个答案:

答案 0 :(得分:2)

这是因为构造函数不能异步。只需将代码移动到void方法,如:

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

另一个选项可能更好(通过一些调整,例如按钮按钮上打开扫描仪页面)是OnAppearing方法创建扫描页面,但是在扫描完成时要小心Navigation.PopAsync()被调用OnAppearing在您的MainPage上调用。因此,在这种情况下,新的扫描页面将被推高。

答案 1 :(得分: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            
    }

这应该足够了。

<强>更新

如下所述,使用此代码将需要一个变量来知道页面是否已加载,以防止从扫描仪返回时再次显示ZXing页面。

这就是我更喜欢在用户迭代上打开扫描页面(轻按按钮,滑动或任何其他手势)以防止这样的循环的原因。

祝你好运。