【发布时间】:2018-06-23 10:47:53
【问题描述】:
我想使用 mvvmcross 中的视图模型从一个屏幕移动到下一个屏幕,并将一些模型传递给下一个视图模型。但我遇到了以下崩溃:
MvvmCross.Platform.Exceptions.MvxException:无法从定位器 MvxDefaultViewModelLocator 构造和初始化 iManage.ViewModels.LoginViewModel 类型的 ViewModel - 检查 InnerException 以获取更多信息 ---> MvvmCross.Platform.Exceptions.MvxException:创建类型的 viewModel 时出现问题LoginViewModel ---> MvvmCross.Platform.Exceptions.MvxIoCResolveException:创建 iManage.ViewModels.LoginViewModel 时无法解析 SchoolModel 类型参数项的参数 在 MvvmCross.Platform.IoC.MvxSimpleIoCContainer.GetIoCParameterValues(System.Type 类型,System.Reflection.ConstructorInfo firstConstructor)[0x00066] 在 :0 在 MvvmCross.Platform.IoC.MvxSimpleIoCContainer.IoCConstruct (System.Type 类型) [0x0002c] 在 :0 在 MvvmCross.Platform.Mvx.IocConstruct (System.Type t) [0x00006] 在 :0 在 MvvmCross.Core.ViewModels.MvxDefaultViewModelLocator.Load (System.Type viewModelType, MvvmCross.Core.ViewModels.IMvxBundle parameterValues, MvvmCross.Core.ViewModels.IMvxBundle savedState) [0x00000] in :0 --- 内部异常堆栈跟踪结束 --- 在 MvvmCross.Core.ViewModels.MvxDefaultViewModelLocator.Load (System.Type viewModelType, MvvmCross.Core.ViewModels.IMvxBundle parameterValues, MvvmCross.Core.ViewModels.IMvxBundle savedState) [0x00029] in :0 在 MvvmCross.Core.ViewModels.MvxViewModelLoader.LoadViewModel (MvvmCross.Core.ViewModels.MvxViewModelRequest 请求,MvvmCross.Core.ViewModels.IMvxBundle savedState)[0x00035] 在:0 --- 内部异常堆栈跟踪结束 --- 在 MvvmCross.Core.ViewModels.MvxViewModelLoader.LoadViewModel (MvvmCross.Core.ViewModels.MvxViewModelRequest 请求,MvvmCross.Core.ViewModels.IMvxBundle savedState)[0x00068] 在:0 在 MvvmCross.iOS.Views.MvxViewControllerExtensionMethods.LoadViewModel (MvvmCross.iOS.Views.IMvxIosView iosView) [0x0005f] 在 :0 在 MvvmCross.Core.Views.MvxViewExtensionMethods.OnViewCreate (MvvmCross.Core.Views.IMvxView 视图,System.Func`1[TResult] viewModelLoader) [0x00012] in :0 在 MvvmCross.iOS.Views.MvxViewControllerExtensionMethods.OnViewCreate (MvvmCross.iOS.Views.IMvxIosView iosView) [0x00001] 在 :0 在 中的 MvvmCross.iOS.Views.MvxViewControllerAdapter.HandleViewDidLoadCalled (System.Object sender, System.EventArgs e) [0x00007]:0 at at (wrapper delegate-invoke) :invoke_void_object_EventArgs (object,System.EventArgs) 在 MvvmCross.Platform.Core.MvxDelegateExtensionMethods.Raise (System.EventHandler eventHandler, System.Object sender) [0x00003] in :0 在 MvvmCross.Platform.iOS.Views.MvxEventSourceViewController.ViewDidLoad () [0x00006] 在 :0 在 MvvmCross.iOS.Views.MvxViewController.ViewDidLoad () [0x00001] 在 :0 在 iManage.iOS.Views.LoginView.ViewDidLoad () [0x00001] 在 /Users/pankajsachdeva/Projects/iManage/iOS/Views/LoginView.cs:18 at at (wrapper managed-to-native) UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr) 在 /Users/builder/data/lanes/5665/f70a1348/source/xamarin-macios/src/UIKit 中的 UIKit.UIApplication.Main(System.String[] args,System.IntPtr 主体,System.IntPtr 委托)[0x00005] /UIApplication.cs:79 在 /Users/builder/data/lanes/5665/f70a1348/source/xamarin-macios/src/UIKit 中的 UIKit.UIApplication.Main (System.String [] args, System.String principalClassName, System.String delegateClassName) [0x00038] /UIApplication.cs:63 在 iManage.iOS.Application.Main (System.String[] args) [0x00001] 在 /Users/pankajsachdeva/Projects/iManage/iOS/Main.cs:17
来自 ViewModel 代码:
public class SchoolSelectionViewModel : BaseViewModel
{
private readonly ISchoolNames _schoolService;
public SchoolSelectionViewModel(ISchoolNames schoolService)
{
_schoolService = schoolService;
}
public override void Start()
{
IsLoading = true;
_schoolService.GetFeedItems(OnDilbertItems, OnError);
}
private void OnDilbertItems(List<SchoolModel> list)
{
IsLoading = false;
Items = list;
}
private void OnError(Exception error)
{
// not reported for now
IsLoading = false;
}
private List<SchoolModel> _items = new List<SchoolModel>();
public List<SchoolModel> Items
{
get { return _items; }
set { _items = value; RaisePropertyChanged(() => Items); }
}
private MvxCommand<SchoolModel> _itemSelectedCommand;
public ICommand ItemSelectedCommand
{
get
{
_itemSelectedCommand = _itemSelectedCommand ?? new MvvmCross.Core.ViewModels.MvxCommand<SchoolModel>(DoSelectItem);
return _itemSelectedCommand;
}
}
private void DoSelectItem(SchoolModel item)
{
//ShowViewModel<LoginViewModel>(item);
ShowViewModel<LoginViewModel>(new LoginViewModel(item));
}
}
到 ViewModel 代码:
public class LoginViewModel : BaseViewModel
{
private readonly ILoginService _loginService;
private readonly IDialogService _dialogService;
public LoginViewModel(SchoolModel item)
{
//_loginService = loginService;
//_dialogService = dialogService;
School = item;
Username = "TestUser";
Password = "YouCantSeeMe";
IsLoading = false;
}
private SchoolModel _school;
public SchoolModel School
{
get
{
return _school;
}
set
{
SetProperty(ref _school, value);
RaisePropertyChanged(() => School);
}
}
private string _username;
public string Username
{
get
{
return _username;
}
set
{
SetProperty(ref _username, value);
RaisePropertyChanged(() => Username);
}
}
private string _password;
public string Password
{
get
{
return _password;
}
set
{
SetProperty(ref _password, value);
RaisePropertyChanged(() => Password);
}
}
private IMvxCommand _loginCommand;
public virtual IMvxCommand LoginCommand
{
get
{
_loginCommand = _loginCommand ?? new MvxCommand(AttemptLogin, CanExecuteLogin);
return _loginCommand;
}
}
private void AttemptLogin()
{
if (_loginService.Login(Username, Password))
{
ShowViewModel<DashboardStdViewModel>();
}
else
{
_dialogService.Alert("We were unable to log you in!", "Login Failed", "OK");
}
}
private bool CanExecuteLogin()
{
return (!string.IsNullOrEmpty(Username) || !string.IsNullOrWhiteSpace(Username))
&& (!string.IsNullOrEmpty(Password) || !string.IsNullOrWhiteSpace(Password));
}
}
编辑1: 在我的 ViewModel 中修改了以下内容:
private async void DoSelectItem(SchoolModel item)
{
await _navigationService.Navigate<LoginViewModel,SchoolModel>(item);
}
将下一个 ViewModel 声明更改如下:
public class LoginViewModel : MvxViewModel<SchoolModel>
当我尝试显示下一个视图模型时它仍然崩溃,并出现以下错误:
对象引用未设置为对象的实例。
Edit2:
完全错误:
System.NullReferenceException:对象引用未设置为对象的实例 在 iManage.ViewModels.SchoolSelectionViewModel+d__19.MoveNext () [0x0000f] 在 /Users/pankajsachdeva/Projects/iManage/iManage/ViewModels/SchoolSelectionViewModel.cs:67 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] 在 /Library/Frameworks/Xamarin.iOS.framework/Versions/11.6.1.3/src/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices /exceptionservicescommon.cs:152 在 System.Runtime.CompilerServices.AsyncMethodBuilderCore+c.b__6_0(System.Object 状态)[0x00000] 在 /Library/Frameworks/Xamarin.iOS.framework/Versions/11.6.1.3/src/mono/mcs/class/referencesource/ mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:1018 在 UIKit.UIKitSynchronizationContext+c__AnonStorey0.m__0 () [0x00000] 在 /Users/builder/data/lanes/5665/f70a1348/source/xamarin-macios/src/UIKit/UIKitSynchronizationContext.cs:24 在 /Users/builder/data/lanes/5665/f70a1348/source/xamarin-macios/src/Foundation/NSAction.cs:163 中的 Foundation.NSAsyncActionDispatcher.Apply () [0x00000] at at (wrapper managed-to-native) UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr) 在 /Users/builder/data/lanes/5665/f70a1348/source/xamarin-macios/src/UIKit 中的 UIKit.UIApplication.Main(System.String[] args,System.IntPtr 主体,System.IntPtr 委托)[0x00005] /UIApplication.cs:79 在 /Users/builder/data/lanes/5665/f70a1348/source/xamarin-macios/src/UIKit 中的 UIKit.UIApplication.Main (System.String [] args, System.String principalClassName, System.String delegateClassName) [0x00038] /UIApplication.cs:63 在 iManage.iOS.Application.Main (System.String[] args) [0x00001] 在 /Users/pankajsachdeva/Projects/iManage/iOS/Main.cs:17
【问题讨论】:
-
这就是为什么 ViewModel 导航没有任何意义哈哈。
-
“对象引用未设置为对象的实例”从何而来?你能附上完整的异常堆栈跟踪吗?你用的是什么版本的 MvvmCross?
-
请检查我的编辑
-
SchoolSelectionViewModel.cs的第 67 行是什么?您似乎可以在此处找到空引用 -
等待_navigationService.Navigate
(item); item 是 SchoolModel 类型的对象,它有数据并且不为空
标签: c# xamarin mvvm xamarin.ios mvvmcross