我正在尝试在我的一个应用程序中使用MvvmCross v3,其中包括活动,内容提供程序和广播接收器。但是,我不太成功。
该应用程序包含一个包含逻辑,模型和视图模型的Core PCL以及一个包含所有MonoDroid特定内容的Droid应用程序。
在Core中我有一个App:MvxApplication类,在Droid中我有一个Setup:MvxSetup类,它创建一个App-instance并初始化东西。
我可以毫无问题地将IOC部分与内容提供商,广播接收者和非Mvx活动一起使用。当我现在想要添加MvxActivity时,它会崩溃。
当Mvx活动启动时,我得到一个异常“Cirrious.CrossCore.Exceptions.MvxException:MvxTrace已经初始化”。
显然我在错误的顺序/错误的位置初始化事物。但是,我需要一个指向正确方向的指针。
我的App类
public class App
: MvxApplication
{
public override void Initialize()
{
base.Initialize();
InitialisePlugins();
InitaliseServices();
InitialiseStartNavigation();
}
private void InitaliseServices()
{
CreatableTypes().EndingWith("Service").AsInterfaces().RegisterAsLazySingleton();
}
private void InitialiseStartNavigation()
{
}
private void InitialisePlugins()
{
// initialise any plugins where are required at app startup
// e.g. Cirrious.MvvmCross.Plugins.Visibility.PluginLoader.Instance.EnsureLoaded();
}
}
我的设置类
public class Setup
: MvxAndroidSetup
{
public Setup(Context applicationContext)
: base(applicationContext)
{
}
protected override IMvxApplication CreateApp()
{
return new App();
}
protected override IMvxNavigationSerializer CreateNavigationSerializer()
{
return new MvxJsonNavigationSerializer();
}
public override void LoadPlugins(Cirrious.CrossCore.Plugins.IMvxPluginManager pluginManager)
{
pluginManager.EnsurePluginLoaded<Cirrious.MvvmCross.Plugins.Json.PluginLoader>();
base.LoadPlugins(pluginManager);
}
public void RegisterServices()
{
// I register a bunch of singletons here
}
// The following is called from my content provider's OnCreate()
// Which is the first code that is run
public static void DoSetup(Context applicationContext)
{
var setup = new Setup(applicationContext);
setup.Initialize();
setup.RegisterServices();
}
我的内容提供商的OnCreate():
public override bool OnCreate()
{
Log.Debug(Tag, "OnCreate");
_context = Context;
Setup.DoSetup(_context);
return true;
}
我的Mvx活动:
[Activity(Label = "@string/ApplicationName", MainLauncher = true)]
[IntentFilter(new[] { "Settings" })]
public class SettingsView
: MvxActivity
{
public new SettingsViewModel ViewModel
{
get { return (SettingsViewModel) base.ViewModel; }
set { base.ViewModel = value; }
}
protected override void OnViewModelSet()
{
SetContentView(Resource.Layout.Page_SettingsView);
}
}
答案 0 :(得分:3)
简短回答(我在移动机场)
所有mvx android视图都会检查单例是否已创建 - https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross.Droid/Platform/MvxAndroidSetupSingleton.cs(vnext树 - 但在v3上类似)
因此,如果您正在创建设置但未设置此单例,那么您将在第一次显示视图时创建第二个设置
我怀疑你可以通过单件类创建你的设置,但是如果这不够灵活以满足你的需求,那么请在github上记录一个问题
也希望看到一些关于此的博客 - 我没有太多使用自定义内容提供商(根本没有!)