更新到MvvmCross 6.2.2后,无法解析自定义Android ViewPresenter中的IMvxViewModelLoader实例

时间:2018-12-21 15:22:27

标签: android xamarin mvvmcross

我制作了一个使用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搜索线索。

1 个答案:

答案 0 :(得分:1)

创建演示者后,将创建

IMvxViewModelLoader。这就是为什么在IoC构造演示者或尝试解析演示者时遇到解决问题的原因。

您可以做的是将其延迟加载,或者IoC通知IMvxViewModelLoader已加载到IoC中。

在第一种情况下,您可以简单地在演示者中创建一个属性,使用该属性时会检查是否为空:

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
});