Я создаю приложение 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;
}
}
}