我制作了一个使用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/

10-09 00:03