我制作了一个使用IMvxViewModelLoader
的自定义Android视图演示器。在将MvvmCross从5.7版本更新到6.2.2之前,我曾经获得过一个IMvxViewModelLoader
通过依赖项注入:
public class CustomPresenter : MvxAndroidViewPresenter
{
private readonly IMvxViewModelLoader _viewModelLoader;
private readonly IFragmentTypeLookup _fragmentTypeLookup;
private Android.Support.V4.App.FragmentManager _fragmentManager;
public CustomPresenter(IMvxViewModelLoader viewModelLoader, IFragmentTypeLookup fragmentTypeLookup) : base(new List<Assembly>())
{
_fragmentTypeLookup = fragmentTypeLookup;
_viewModelLoader = viewModelLoader;
}
// Other code
}
在从
Setup
继承的MvxAndroidSetup
类中,我重写了IMvxAndroidViewPresenter CreateViewPresenter()
方法:public class Setup : MvxAndroidSetup
{
protected override IMvxApplication CreateApp()
{
return new App();
}
protected override IMvxTrace CreateDebugTrace()
{
return new DebugTrace();
}
protected override void InitializeIoC()
{
base.InitializeIoC();
Mvx.RegisterSingleton<IFragmentTypeLookup>(new FragmentTypeLookup());
Mvx.RegisterSingleton<IFileLocationService>(new FileLocationService());
Mvx.RegisterSingleton<ISQLitePlatform>(new SQLitePlatformAndroid());
}
protected override IMvxAndroidViewPresenter CreateViewPresenter()
{
var presenter = Mvx.IocConstruct<CustomPresenter>();
Mvx.RegisterSingleton<IMvxAndroidViewPresenter>(presenter);
return presenter;
}
// Other code
}
更新后,必须对
protected override IMvxAndroidViewPresenter CreateViewPresenter()
方法进行一些更改,因此我将其更改为:protected override IMvxAndroidViewPresenter CreateViewPresenter()
{
var presenter = Mvx.IoCProvider.IoCConstruct<CustomPresenter>();
Mvx.IoCProvider.RegisterSingleton<IMvxAndroidViewPresenter>(presenter);
return presenter;
}
现在运行该应用程序将在
CustomPresenter
的构造函数内引发异常,该异常指示无法解析IMvxViewModelLoader
实例。我没有在任何地方注册它,但是我假设MvvmCross为我做了这个,因为我在更新之前没有在任何地方注册它。更具体地说,当我调用base.InitializeIoC();
时,我以为MvvmCross为我做到了。我还尝试通过将
IMvxViewModelLoader
构造函数更改为以下内容来检索CustomPresenter
的实例:public CustomPresenter() : base(new List<Assembly>())
{
_fragmentTypeLookup = Mvx.IoCProvider.Resolve<IFragmentTypeLookup>();
_viewModelLoader = Mvx.IoCProvider.Resolve<IMvxViewModelLoader>();
}
但结果相同。
我未通过更新文档Upgrade from 5 to MvvmCross 6搜索线索。
最佳答案
创建演示者后,将创建IMvxViewModelLoader
。这就是为什么在IoC构造演示者或尝试解析其演示者时遇到解决问题的原因。
您可以做的是延迟加载它,或者被IoC通知IMvxViewModelLoader
已被加载到IoC中。
在第一种情况下,您可以在演示者中简单地创建一个Property,当您使用它时,它会检查null:
private IMvxViewModelLoader _viewModelLoader;
private IMvxViewModelLoader ViewModelLoader
{
get
{
if (_viewModelLoader == null)
_viewModelLoader = Mvx.IoCProvider.Resolve<IMvxViewModelLoader>();
return _viewModelLoader;
}
}
要在注册
IMvxViewModelLoader
时回叫:Mvx.IoCProvider.CallbackWhenRegistered<IMvxViewModelLoader>(loader =>
{
// do your stuff here when it loads
});
关于android - 更新到MvvmCross 6.2.2后,无法解析自定义Android ViewPresenter中的IMvxViewModelLoader实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53887185/