Возврат ScanPage Xamarin - PullRequest
       9

Возврат ScanPage Xamarin

0 голосов
/ 10 декабря 2018

У меня есть кнопка с открытым сканом (как модал).Когда я сканирую QRCode, у меня появляется предупреждение с двумя кнопками.Когда я нажимаю «нет», я хочу вернуться к своему сканированию, а не к своей странице (listPeoplePage).

Поэтому у меня есть кнопка ScanClicked (когда я открываю сканирование)

 private async Task BtnScanClicked(object sender, EventArgs e)
    {
        // Ouverture de la page de scan
        scanPage = DependencyService.Get<IScanPage>(); // new ZXingScannerPage();

        if (scanPage.scannerPage.IsScanning)
            return;

        scanPage.scannerPage.IsScanning = true;
        if (scanPage.scannerPage.Parent == null)
        {
            // On affiche la page
            await Navigation.PushModalAsync(scanPage.scannerPage); //.PushAsync(scanPage.scannerPage);
        }

        // Le check des résultats
        scanPage.scannerPage.OnScanResult += (result) =>
        {
            // Pour éviter de le faire tant que le client n'a pas validé
            if (scanPage.scannerPage.IsScanning == false)
                return;

            // On stoppe le scan
            scanPage.scannerPage.IsScanning = false;

            // On retire la page et on montre le résultat
            Device.BeginInvokeOnMainThread(async () =>
            {

                // On essaye de récupérer le code IdA09 si il existe et on appelle le WS
                string paramA09 = getParameterByName(result.Text, "IdA09");
                if (!string.IsNullOrEmpty(paramA09))
                {
                    //await DisplayAlert("Scanned barcode", paramA09, "OK");

                    await SendPresenceAck(paramA09,sender,e); //, this.idPrestation);

                }
                else
                {
                    // Message d'erreur
                    await this.DisplayAlert("Attention", "Erreur de la validation d'un invité par QR Code.", "Cancel");


                }


                await Navigation.PopModalAsync(); //.PopAsync();


            });
        };

    }

И есть метод SendPresenceAck, когда я сканирую QrCode

  private async Task SendPresenceAck(string paramA09, object sender, EventArgs e) //, int? idPrestation)
    {

        int idParticipant;
        if (!int.TryParse(paramA09, out idParticipant))
        {
            //await this.ShowAlert("Attention", "Problème de lecture du QR Code.");
            await this.DisplayAlert("Attention", "Problème de lecture du QR Code.", "Yes","No");

            return;
        }

        // On appelle le WS pour signifier la présence
        // On passe par validateService
        // On prépare la validation de la présence
        var validateService = new ValidatePresenceService(this.Token);

        // On ajoute la ligne à valider
        var validate = validateService.AddNewPresence(idParticipant, this.idPrestation, true);

        // On déclenche l'envoi au WS (si besoin)
        if (validate != null)
        {
            // On envoie uniquement en cas de connexion
            if (!Global.GetSettingsBool(TypeSettings.IsHorsConnexion))
            {
                //await validateService.SendAll();
                // Attention : si participant déjà enregistré : erreur 403
                try
                {
                    await validateService.Send(await validate);
                    await this.DisplayAlert("OK", "Le billet est validé.", "OK");
                }
                catch (WebException ex)
                {
                    HttpWebResponse objresponse = ex.Response as HttpWebResponse;
                    if (objresponse.StatusCode == HttpStatusCode.Forbidden)
                    {
                        // 403 : le participant a déjà été enregistré aujourd'hui
                        // Message d'erreur
                        await this.DisplayAlert("Attention", "Le billet a déjà été enregistré, le numéro du billet a déjà été scanné auparavant.", "Yes", "No");
                        return;
                    }
                    else if (objresponse.StatusCode == HttpStatusCode.NotFound)
                    {
                        // 404 : billet non valide
                        var alert = await this.DisplayAlert("Attention", "Le billet n'est pas valide.", "Yes","No");
                        if (alert==true)
                        return;
                        else
                        {

                        }
                    }
                    else if (objresponse.StatusCode == HttpStatusCode.Unauthorized)
                    {
                        // 401 : impossible d'identifier le numéro du billet
                       var alert =  await this.DisplayAlert("Attention", "Impossible d'identifier le numéro du billet, veuillez vérifier les informations de celui ci.", "Yes", "No");
                        if (alert==true)
                        return;
                        else
                        {
                            Debug.WriteLine(alert);
                        }
                    }
                }
                catch (Exception exception)
                {
                    // Erreur
                    await this.DisplayAlert("Attention", exception.Message, "Yes", "No");
                    return;
                }
            }
            else
            {
                // Hors connexion : on vérifie juste si l'utilisateur n'est pas déjà présent dans la table SQL

                // Attention : si pas de prestation : on a le droit d'enregistrer plusieurs fois la présence
                // Si il y a une prestation, en revanche, on doit vérifier qu'il n'est pas déjà inscrit

                if (validate.Result.IdPrestation.HasValue &&
                    validateService.IsInscriptionAlreadyRecorded(await validate))
                {
                    // Déjà trouvé : message d'erreur
                    await this.DisplayAlert("Attention", "Le participant a déjà été enregistré.", "Yes", "No");

                    return;
                }

            }
        }
        else
        {
            // Pb à l'insertion des données ??

        }


        //return;

        await BtnScanClicked(sender, e);
    }

Так что я хочу, чтобы при сканировании я нажимал кнопку, чтобы вернуться к сканированию для сканирования другого QrCode.Это своего рода кнопка «Вы хотите сканировать в другой раз?»

Редактировать: На данный момент единственным важным сообщением является «», ожидайте этого. DisplayAlert («Внимание», «Проблема чтения лекции QR-кода»)."," Да "," Нет ");

На английском языке (" Предупреждение ", проблема с чтением QR-кода." "Да", "Нет");

Я пытаюсь вызвать снова в конце функции SendPresenceAck, но она не работает.На данный момент, если вы отвечаете «да» или «нет», это ничего не делает.Я хочу вернуться к сканированию, если вы ответите «да», и вернуться на страницу, если ответите «нет».

1 Ответ

0 голосов
/ 12 декабря 2018

Может потребоваться увидеть больше кода, но вы всегда выдвигаете свою страницу сканера в конце OnScanResult, вызывая:

await Navigation.PopModalAsync(); 

в конце метода OnScanResult, поэтому нетнезависимо от того, что вы делаете в SendPresenceAck, когда вы возвращаетесь из этого метода, вы открываете страницу модального сканера.

Из-за неанглийского (французского?) Текста мне сложно узнать, какое предупреждение запрашивает пользователь, хочет ли он сканировать другой код, но независимо от того, что он ответит, страница будет отображаться.

Ой, подождите, похоже, у вас есть какая-то рекурсия?то есть BtnScanClicked звонит SendPresenceAck и SendPresenceAck звонит BtnScanClicked в конце ... Мне нужно было бы копать всю вашу логику, чтобы увидеть, может ли это быть проблемой, но опять же, это трудно из-зане английский язык мешает мне следить за потоком кода после ответов пользователя на несколько предупреждений.

...