Xamarin.Forms ZXing Qr-Code Scanner System.NullReferenceException: 'Ссылка на объект не установлена ​​для экземпляра объекта.' - PullRequest
0 голосов
/ 20 марта 2020

enter image description here Я создаю приложение xamarin.forms с логином qr-кода. Когда qr-код действителен, он в порядке, пользователь является логином, но когда он не в порядке, я получил System.NullReferenceException: «Ссылка на объект не установлена ​​на экземпляр объекта». в конце scanPage.OnScanResult. это мой код:

Мои свойства:

  public Command ScanQrCodeCommand { get; set; }
        public Command LogInCommand { get; set; }
        ZXingScannerPage scanPage = new ZXingScannerPage();
        public String username;
        public string Username
        {
            get { return username; }
            set
            {
                if (username != value)
                {
                    username = value;

                    SetProperty(ref username, value);
                    OnPropertyChanged("Username");

                }
            }
        }

        public String password;
        public string Password
        {
            get { return password; }
            set
            {
                if (password != value)
                {
                    password = value;

                    SetProperty(ref password, value);
                    OnPropertyChanged("Password");

                }
            }
        }
        public User user;
        public User User
        {
            get { return user; }
            set
            {
                if (user != value)
                {
                    user = value;

                    SetProperty(ref user, value);
                    OnPropertyChanged("User");

                }
            }
        }
        public LoginViewModel()
        {
            ScanQrCodeCommand = new Command(execute: async () => await ExecuteScanQrCodeCommand());
            LogInCommand = new Command(execute: async (user_created) => await ExecuteLogInCommand(user_created));
            User = new User();
            scanPage = new ZXingScannerPage();
            Username = string.Empty;
            Password = string.Empty;
        }

Задача для сканирования кода:

        async Task ExecuteScanQrCodeCommand()
        {
            if (IsBusy)
                return;

            IsBusy = true;

            var config = new ProgressDialogConfig()
            .SetTitle("Loading...")
            .SetIsDeterministic(false)
            .SetMaskType(MaskType.Clear);
            UserDialogs.Instance.Progress(config);
            try
            {        
                await Application.Current.MainPage.Navigation.PushAsync(scanPage);

                scanPage.OnScanResult += (result) =>
                {
                    LogInCommand.Execute(result.ToString());
                    scanPage.IsScanning = false;

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

                        await Application.Current.MainPage.Navigation.PopAsync();

                    });
                };<--- Here i get NullREferenceException
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
                string error = ex.Message;
                await Application.Current.MainPage.DisplayAlert("Error", "Sth wrong with the code", "OK");
            }
            finally
            {
                IsBusy = false;
                UserDialogs.Instance.Progress(config).Dispose();
            }
        }

Задача для ведения журнала:

        async Task ExecuteLogInCommand(object userLog)
        {

            if (IsBusy)
                return;

            IsBusy = true;

            var config = new ProgressDialogConfig()
            .SetTitle("Loading...")
            .SetIsDeterministic(false)
            .SetMaskType(MaskType.Clear);
            UserDialogs.Instance.Progress(config);
            try
            {
                var user_log = userLog as string;
                var pom = user_log.split(" ")
                Username = pom[0];
                Password = pom[1];
                User = await FinansovoPreglediDataStore.GetUserToken(Username , Password );
                if (User != null && User.AccessToken != null)
                {
                    SharedFunctions.SaveAccessToken(User.AccessToken);
                    Application.Current.MainPage = new NavigationPage(new MainMenu());
                }
                else if (User.AccessToken is  null)
                {
                    await Application.Current.MainPage.DisplayAlert("ERROR", "WRONG USER, "OK");
                    Application.Current.MainPage = new NavigationPage(new MainPage());
                }

            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
                string error = ex.Message;
                await Application.Current.MainPage.DisplayAlert("ERROR", "STH. WRONG", "OK");
            }
            finally
            {
                IsBusy = false;
                UserDialogs.Instance.Progress(config).Dispose();

            }
        }

Мой вызов API:

        public async Task<User> GetUserToken(string username, string password)
        {
            try
            {
                if (CrossConnectivity.Current.IsConnected)
                {
                    User user = new User();
                    if (username == null || password == null || !CrossConnectivity.Current.IsConnected)
                        return null;
                    client.DefaultRequestHeaders.Accept.Clear();
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                    HttpContent requestContent = new StringContent("grant_type=password&username=" + username + "&password=" + password + "&login_type=" + "login_user", Encoding.UTF8, "application/x-www-form-urlencoded");
                    HttpResponseMessage responseMessage = await client.PostAsync("Token", requestContent);
                    var pom = responseMessage.StatusCode;
                    if (responseMessage.IsSuccessStatusCode)
                    {
                        string jsonMessage;
                        using (Stream responseStream = await responseMessage.Content.ReadAsStreamAsync())
                        {
                            jsonMessage = new StreamReader(responseStream).ReadToEnd();
                        }
                        user = (User)JsonConvert.DeserializeObject(jsonMessage, typeof(User));
                        return user;
                    }
                    else
                    {
                        return null;
                    }
                }
                else
                {

                    GetToastConfig.GetToastNoInternetConnection();
                    return null;
                }
            }
            catch(Exception ex)
            {
                Debug.WriteLine(ex);
                string error = ex.Message;
                return null;
            }
        }

Я не могу действительно найти, в чем проблема. Какой объект является нулевым ?! У кого-то такая же проблема?

ОБНОВЛЕНИЕ Я наконец-то нашел ее. Для всех ответов я делаю тост. Когда пользователь сканирует не того пользователя или передает его, возвращает badRequest с сервера и go в тосте по умолчанию. Но я не знаю, почему можно сделать экземпляр GetToastConfig. В BaseViewModel со службой зависимости я определяю их все и наследую. Может быть, нет страницы с этим AsyncPop, чтобы показать, кто-то помочь?

    public class GetStatusCode : BaseViewModel
    {
        public GetStatusCode() { }      
        public async void GetResponseCode(int status_code)
        {
            switch (status_code)
            {
                case 404:
                    GetToastConfig.GetToastStatus404();
                    break;
                case 401:
                    var user = await FinansovoPreglediDataStore.RefreshToken(SharedFunctions.GetRefreshToken());
                    if (user != null && user.AccessToken != null)
                    {
                        SharedFunctions.SaveAccessToken(user.AccessToken);
                        SharedFunctions.SaveUser(user);
                        SharedFunctions.SaveRefreshToken(user.RefreshToken);
                        SharedFunctions.SaveUserFirmi(user.Firms);
                    }
                    break;
                case 500:
                    GetToastConfig.GetToastStatus500();
                    break;
                default:
                   GetToastConfig.GetToastStatusDefault();<---- Here get NullReferenceException
                    break;
            }
        }
    }
...