Вылет после использования страницы сканера - PullRequest
0 голосов
/ 27 мая 2019

Я использую библиотеку fanatisc для сканирования, но у меня возникла новая проблема. После того, как я установил свою последнюю переменную, у меня не получается, почему. Я думаю, что это может иметь какое-то отношение к потокам в связи с тем, что его сбой

private async void BtnTestScan_Clicked(object sender, EventArgs e)
{

        var scanPage = new ZXingScannerPage();
        scanPage.ToggleTorch();
        scanPage.IsScanning = true;
        // Navigate to our scanner page
        await Navigation.PushAsync(scanPage);


        scanPage.OnScanResult += (result) =>
        {


            // Stop scanning
            scanPage.IsScanning = false;

            // Pop the page and show the result
            Device.BeginInvokeOnMainThread(async () =>
            {
                BomComponentData getInfo = new BomComponentData();


                await Navigation.PopAsync();
                if (isBomScan.IsToggled == false)
                {
                    getInfo = await database.GetProductInfoByBarCode(result.Text);


                    lblOpertationName.Text = "Operation Name: " + getInfo.OperationName;
                    //var popup1 = new FuelStockApp.Views.PopupInputBox("You scanned the item " + getInfo.Name + "You need to pick " + getInfo.Quantity.ToString(), Convert.ToInt16(getInfo.Quantity));
                    BarCode = result.Text;
                    //await Rg.Plugins.Popup.Services.PopupNavigation.Instance.PushAsync(popup1);
                    Int32.TryParse(txtQtyUpdate.Text, out int Qty);
                    lblQty.Text = Qty.ToString();
                    gridItems.IsVisible = false;
                    txtCode.Text = BomId;
                    lblOpertationName.Text = "Operation Name: " + getInfo.OperationName;
                    lblBinLocation.Text = "Bin Location : " + getInfo.BinLocation.ToString();
                    lblBinLocationLabel.Text = "Bin Name : " + getInfo.BinName.ToString();

                    QtyToDeduct = Qty;
                }

}

Я думаю, что библиотека может вызывать BeginInvoiteOnMainThread.

Я правильно настроил в соответствии с документацией со следующим в моем mainactivy.cs

public class MainActivity : 

global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(savedInstanceState);

            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            Rg.Plugins.Popup.Popup.Init(this,savedInstanceState);

            LoadApplication(new App());
            }
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
            global::ZXing.Net.Mobile.Android.PermissionsHandler.OnRequestPermissionsResult(requestCode, permissions, grantResults);
            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}

Сбой сразу после того, как закончилось мое появившееся событие. Там все просто стандартные вещи.

protected async override void OnAppearing()
{
         base.OnAppearing();


        await database.copydb();

        List<BomComponentData> _boms = new List<BomComponentData>();


        _boms = await database.GetBomsAsync(BomId);
        viewModel.Boms = _boms.ToObservableCollection();
        viewModel.LoadItemsCommand.Execute(null);
        warehouses.RemoveAll (x => x.WarehouseID > 0);
        PickerItems.Clear();
        PickerItemList.Clear();
        warehouses = await database.GetWarehousesFromSage();
        if (warehouses.Count > 0)
        {
            viewModel.Warehouses = warehouses.ToObservableCollection();
            foreach (var warehouse in warehouses)
            {
                if (warehouse.Description == "")
                    warehouse.Description = warehouse.Name;


                PickerItems.Add(warehouse.WarehouseID.ToString(), warehouse.Description);

            }
            pickWarehouse.ItemsSource = PickerItemList;
        }

}

Необработанное исключение:

System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра> объекта.

Это все, что я получаю, я не получаю никакой дополнительной информации об ошибке.

Редактировать 2

Я обнаружил, что исключение происходит здесь, в моей паре значений ключей, а не zxing. Так что я изменил название, кажется, здесь.

  private async void PickWarehouse_SelectedIndexChanged(object sender, EventArgs e)
    {
        btnTestScan.IsVisible = true;
        gridItems.IsVisible = true;
        txtCode.IsVisible = true;


        KeyValuePair<string, string> selectedEntry= (KeyValuePair<string, string>)pickWarehouse.SelectedItem;

        List<BomComponentData> _boms = new List<BomComponentData>();


        WarehouseId = long.Parse(selectedEntry.Key);
        _boms = await database.GetBomsAsync(txtCode.Text);
        viewModel.Boms = _boms.ToObservableCollection();
        gridItems.ItemsSource = _boms;


    }

На этой строке в частности

 KeyValuePair<string, string> selectedEntry= (KeyValuePair<string, string>)pickWarehouse.SelectedItem;
...