Xamarin.Forms ZXing二维码扫描系统.NullReferenceException:';对象引用未设置为对象的实例;
我正在制作一个带有二维码登录的xamarin.forms应用程序。当qr码有效时,其ok用户登录,但当它不正常时,我在scanPage.OnScanResult的末尾得到System.NullReferenceException:“对象引用未设置为对象的实例。”。这是我的代码: 我的属性:Xamarin.Forms ZXing二维码扫描系统.NullReferenceException:';对象引用未设置为对象的实例;,xamarin.forms,nullreferenceexception,zxing,Xamarin.forms,Nullreferenceexception,Zxing,我正在制作一个带有二维码登录的xamarin.forms应用程序。当qr码有效时,其ok用户登录,但当它不正常时,我在scanPage.OnScanResult的末尾得到System.NullReferenceException:“对象引用未设置为对象的实例。”。这是我的代码: 我的属性: public Command ScanQrCodeCommand { get; set; } public Command LogInCommand { get; set; }
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();
}
}
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;
}
}
扫描代码的任务:
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();
}
}
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;
}
}
我对API的调用:
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();
}
}
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;
}
}
public异步任务GetUserToken(字符串用户名、字符串密码)
{
尝试
{
if(交叉连接.当前.断开连接)
{
用户=新用户();
如果(用户名==null | |密码==null | |!CrossConnectivity.Current.IsConnected)
返回null;
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/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=Wait client.PostAsync(“令牌”,requestContent);
var pom=responseMessage.StatusCode;
if(responseMessage.IsSuccessStatusCode)
{
字符串jsonMessage;
使用(Stream responseStream=await responseMessage.Content.ReadAsStreamAsync())
{
jsonMessage=newstreamreader(responseStream.ReadToEnd();
}
user=(user)JsonConvert.DeserializeObject(jsonMessage,typeof(user));
返回用户;
}
其他的
{
返回null;
}
}
其他的
{
GetToastConfig.GetToAstOnPointerNetConnection();
返回null;
}
}
捕获(例外情况除外)
{
Debug.WriteLine(ex);
字符串错误=例如消息;
返回null;
}
}
我真的找不到问题所在。哪个对象是空的?!有人有同样的问题吗
更新
我终于找到了。对于我得到的所有回应,我都敬酒。当用户扫描错误的用户或传递错误的用户时,从服务器返回badRequest,并进入默认toast。但我不知道为什么我可以做GetToastConfig的例子。在带有dependecy服务的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;
}
}
}
公共类GetStatusCode:BaseViewModel
{
公共GetStatusCode(){}
公共异步void GetResponseCode(int状态\ u代码)
{
开关(状态代码)
{
案例404:
GetToastConfig.GetToastStatus404();
打破
案例401:
var user=wait FinansovoPreglediDataStore.RefreshToken(SharedFunctions.GetRefreshToken());
if(user!=null&&user.AccessToken!=null)
{
SaveAccessToken(user.AccessToken);
SharedFunctions.SaveUser(用户);
SharedFunctions.SaveRefreshToken(user.RefreshToken);
SharedFunctions.SaveUserFirmi(user.Firms);
}
打破
案例500:
GetToastConfig.GetToastStatus500();
打破
违约:
GetToastConfig.GetToastStatusDefault();“哪个对象为null?”-使用调试器并查看堆栈跟踪以找出这个结果,但没有显示我可以看到哪个对象?堆栈跟踪是异常对象上的一个属性,我可以看到吗?