我使用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'
答案 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页面。
这就是我更喜欢在用户迭代上打开扫描页面(轻按按钮,滑动或任何其他手势)以防止这样的循环的原因。
祝你好运。