【问题标题】:How to await my barcode scanning correctly如何正确等待我的条码扫描
【发布时间】:2017-10-02 14:31:21
【问题描述】:

目前我正在努力等待阅读我的二维码:

private async Task<string> ScanQRCode()
    {
        try
        {
            var options = new MobileBarcodeScanningOptions
            {
                AutoRotate = false,
                UseFrontCameraIfAvailable = false,
                TryHarder = true,
                DelayBetweenContinuousScans = 1
            };
            var scanPage = new ZXingScannerPage(options)
            {
                DefaultOverlayTopText = "Align the barcode within the frame",
                DefaultOverlayBottomText = string.Empty,
                DefaultOverlayShowFlashButton = true
            };

            string barcodestring = string.Empty;

            // Navigate to our scanner page
            Device.BeginInvokeOnMainThread(async () =>
            {
                await _navigation.PushModalAsync(scanPage);
            });

            scanPage.OnScanResult += (result) =>
            {
                if (result.Text.IsValidJson<DeviceSetup>())
                {
                    // Stop scanning
                    scanPage.IsScanning = false;

                    // Pop the page and show the result
                    Device.BeginInvokeOnMainThread(async () =>
                    {
                        await _navigation.PopModalAsync(true);
                    });
                    barcodestring = result.Text;
                }
            };

            return barcodestring;
        }
        catch (System.Exception ex)
        {
            Device.BeginInvokeOnMainThread(async () =>
            {
                await _navigation.PopModalAsync(true);
                await _page.DisplayAlert("Error", ex.Message, "OK");
            });
            return "Error";
        }
    }

调用方法继续执行,不等待 QR-Result ..

为什么会这样?

【问题讨论】:

标签: c# xamarin.forms async-await zxing.net


【解决方案1】:

我认为你的问题是你的

await _navigation.PushModalAsync(scanPage)

在 scanPage 可视化时结束。所以你的

return barcodestring;

我认为总是返回一个空字符串。

你应该使用消息中心

            if (result.Text.IsValidJson<DeviceSetup>())
            {
                // Stop scanning
                scanPage.IsScanning = false;

                // Pop the page and show the result
                Device.BeginInvokeOnMainThread(async () =>
                {
                    await _navigation.PopModalAsync(true);
                });

                // Here send a message
                MessagingCenter.Send<MyPage, string>(this, "BarcodeRead", result.Text);
                //barcodestring = result.Text;
            }

您的 MyPage 应该(在 OnAppearing 中)类似

MessagingCenter.Subscribe<MyPage, string> (this, "BarcodeRead", (sender, arg) => {
    // arg should have your barcode...
});

我创建了一个小演示 TestZXing。这是https://github.com/Redth/ZXing.Net.Mobile上演示的重制版

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多