【问题标题】:ZXingScannerView throws A method was called at an unexpected time caused by StopScanningAsync when navigating backZXingScannerView 在导航返回时抛出由 StopScanningAsync 导致的意外时间调用方法
【发布时间】:2019-11-30 09:55:23
【问题描述】:

将 Xamarin Forms 3.6 与 Prism、Fody 和 ZXing 结合使用并运行 UWP 应用程序。

MainPage/Navigation Page/ViewA/ViewB/ViewC?selectedTab=Tab3. 的导航堆栈

Tab3 上有一个 ZXingScannerView 控件。 如果我尝试将按钮返回到 ViewB,则应用程序崩溃并显示错误“在意外时间调用了一个方法。” 异常表明它正在尝试等待 ZXing StopScanningAsync() 方法。

页面顺序是这样的:

MainPage,它是最初显示视图 A 的主详细信息。
视图 A -> 视图 B -> 视图 C,这是一个选项卡式页面
选项卡上有 4 个定义为内容页面的视图,所有这些视图都可以通过最初显示的 Tab1 进行导航。
Tab1是一个简单的数据输入表单
Tab2 有一个输入字段、一个按钮和一个 CustomControl 实例
Tab3 有一个按钮、一个 ZXingScannerView 控件和一个 CustomControl 实例
Tab4 有一个按钮、一个 Image 和一个 CustomControl 实例

所以当用户到达 ViewC 时,导航 uri 应该是 MainPage/Navigation Page/ViewA/ViewB/ViewC?selectedTab=Tab1

问题在于后退按钮操作。
使用 Prism Navigation 我可以捕获 OnNavigatedFrom、OnNavigatingTo、OnNavigatedTo。 在选项卡之间移动时不会发生这些事件。

Tab3 上的 ZXingScannerView 存在问题。
我可以单击每个选项卡并前进和后退以显示每个页面。 只要我不使用 ZXing 视图显示 Tab3,后退按钮(返回 ViewB)就可以工作。必须通过单击按钮来启动扫描,以便在加载页面时控件具有 IsScanning=false。

如果我切换到 Tab3(以及之前或之后的任何其他选项卡),然后尝试将按钮返回到 ViewB,则应用程序崩溃并出现错误“在意外时间调用了方法”。 异常表明它正在尝试等待 ZXing StopScanningAsync() 方法。 标记是这样的:

    <Grid
    HorizontalOptions="FillAndExpand"
    IsVisible="{Binding IsScanning}"
    VerticalOptions="FillAndExpand">
    <zxing:ZXingScannerView
        x:Name="zxing"
        IsAnalyzing="{Binding IsAnalyzing}"
        IsScanning="{Binding IsScanning}"
        ScanResultCommand="{Binding OnScanResult}" />
    <zxing:ZXingDefaultOverlay
        BottomText="Place the red line over the barcode you'd like to scan."
        HeightRequest="20"
        TopText="Accepts EAN-8 or EAN-13 barcodes" />
    </Grid>

而视图模型代码是这样的:

public Tab3PageViewModel(INavigationService navigationService,
                                         IEventAggregator eventAgregatorService,
                                         IPageDialogService dialogService
                                        )
            : base(navigationService, eventAgregatorService)
        {
            _DialogService = dialogService;

            this.IsScanning = false;
            this.IsAnalyzing = false;
        }

        public void Handle_BeginScan()
        {
            IsScanning = true;
            IsAnalyzing = true;
        }

        public void Handle_OnScanResult(Result result)
        {
            MainThread.BeginInvokeOnMainThread(async () =>
            {
                if (result != null)
                {
                    var payload = new PublishedEventPayload()
                    {
                        Code = result.Text,
                        ViewName = this.ViewName
                    };
                    this.AgregatorService.GetEvent<FindByBarcodeEvent>().Publish(payload);
                }
                else
                {
                    await _DialogService.DisplayAlertAsync("Not found", "Unfortunately the ISBN code could not be resolved. Please try again.", "OK");
                }
            });
        }

在 Tab3 上,我放置了一个 OnNavigatedFrom 事件以确保 IsScanning=false,但这并没有什么区别。 该应用程序会在它到达之前崩溃。

Prism Navigation Service 表示它会在调用 NavigateAsync() 时将新视图添加到堆栈中。 从 ViewB 到 ViewC 时,我尝试显式设置完整的导航路径,但对问题没有影响。查看时,导航堆栈似乎是正确的。 这似乎是一个导航问题,但我无法弄清楚为什么 ZXing 控件会干扰。

大家有什么建议吗?

【问题讨论】:

    标签: xamarin xamarin.forms prism zxing


    【解决方案1】:

    我不确定这是否有帮助,但我遇到了 ZXingScanningView 在导航时不尊重设置IsAnalyzing 和IsScanning 的问题。我遇到了一个问题,即使从页面导航后,相机仍会继续扫描条形码。看来您的视图也在继续扫描。我的解决方案是完全删除 OnDisappearing 方法中的 ZXingScanningView,然后在需要时将其重新添加到 OnAppearing。

    例如。我将我的 ZXScanningView 放置在一个仅包含 ZXingScanningView 和 ZXingDefaultOverlay 的网格中。当我将自己的可绑定属性 ScanningEnabled 设置为 false 时,它将清除网格的所有子项。

    【讨论】:

    • 我会试一试的。以前我曾尝试使用 OnDisappearing 方法关闭 IsAnalyzing 和 IsScanning 但没有效果。完全删除控件可能会很好。
    • 遗憾的是,这对我不起作用。我遇到了完全相同的错误。我现在的理论是它与 ZXingScanningView 控件的平台版本有关。我正在使用 UWP 进行测试。该控件当前来自 ZXing.Net.Mobile.Forms 命名空间,这会引发错误。 Github 项目似乎包含针对 UWP 特定版本的视图的修复。这是在 ZXing.Net.Mobile.Forms.WindowsUniversal 命名空间中。我将尝试专门加载它并看看它是如何进行的。
    • 到目前为止,我所有的努力都未能解决或解决这个问题。我已将 ZXingScanningView 的创建放在 OnAppearing 事件中,并将其添加到网格中,同时将网格的子项删除到 OnDisappearing 事件中。我仍然收到致命错误这是没有事先启动扫描。我尝试将控件降级到 2.3.2 版,但没有成功。如果我启动扫描并成功导航到另一个页面,扫描实际上会起作用。回退是使用确实有效的模态 ZXingScanningPage。不是很满意。
    • 我尝试使用 ZXingScanningPage 进行扫描,并且可以找到条形码。还尝试在代码以及 xaml 控件中完成所有操作。我可以单击后退按钮,并且导航正常工作。问题是,通过我的结果处理方法扫描并返回后,页面现在关闭并直接返回到应用程序的根目录,而不是调用页面。我认为这可能是因为我正在使用 Prism Navigation。叹。打算尝试下载 repo 并在那里手动修复。
    猜你喜欢
    • 2023-02-11
    • 1970-01-01
    • 2012-12-28
    • 2018-11-19
    • 2018-02-03
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多