在 Xamarin.Android 和 MvvmCross 中定义应用程序类的基类
Posted
技术标签:
【中文标题】在 Xamarin.Android 和 MvvmCross 中定义应用程序类的基类【英文标题】:Define a base class for application class in Xamarin.Android and MvvmCross 【发布时间】:2014-04-03 13:34:27 【问题描述】:我有一个 XYZ 模块,它主要是一个带有一些 c# 类的预构建 Xamarin android java 绑定库。在“独立”的 Xamarin Android 项目中,它可以完美运行。但现在我想在我的大型跨平台 Xamarin 项目中实现一个插件,它使用 MvvmCross 框架,并遵循 MvvmCross 标准模式。
XYZ 模块需要为 Android Application 类设置一个基类,如下所示:
[Application]
public class Application : XYZApplication
public Application(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
public override void OnCreate()
base.OnCreate();
一般不呈现应用类,MvvmCross Setup.cs从核心项目中获取,CreateApp()方法从核心返回这个类:
public class App : MvxApplication
public override void Initialize()
CreatableTypes().EndingWith("Service").AsInterfaces().RegisterAsLazySingleton();
RegisterAppStart<ViewModels.StartupViewModel>();
如果我没有使用 ApplicationAttribute 指定 Application 类,XYZ 模块在其插件中会失败。如果我这样做了,那么 MvvmCross 框架会失败,当它想要加载我的插件时,pluginloader 会在这一行的第一个插件失败:
manager.EnsurePlatformAdaptionLoaded<PluginLoader>();
带有“无法解析类型”的消息。
我认为问题的根源是Application类不能有两个基类,或者不能创建两次? 也许有一个解决方案,如果你需要定义一个应用程序类,在使用 MvvmCross 时有一个基类。
【问题讨论】:
问题是什么? 【参考方案1】:MvvmCross App
是一个 PCL 类,它提供了一个地方来初始化和列出所有 ViewModel
s 和其他 Model
和 Service
代码。
它完全独立于任何特定于操作系统的Application
或AppDelegate
对象。
如果您需要特定于平台的Application
,则添加一个作为单独的类。
我们试图在https://github.com/MvvmCross/MvvmCross/wiki/High-Level-MvvmCross-Objects 中解释一下
另见MvvmCross: Android Application attribute
【讨论】:
谢谢斯图尔特。我做了一个测试(之前应该做过......),当我这样定义我的应用程序类时:public class MainApp : Application
,基于 Android.App.Application 然后我的项目与 MvvmCross 完美运行。但是当我将基类更改为 XYZApplication 时,MvvmCross 失败,第一个插件的 PluginLoader 无法解析类型。这个 XYZApplication 来自绑定库中的一个 java 类,它扩展了 Application 类public class XYZApplication extends Application
。也许我在这里失踪或做错了什么。
不确定是否有人可以在如此抽象的 XYZ 级别上为您提供帮助。检查跟踪,启用所有可以的调试输出,提供尽可能多的调试 - 可能是在一个新问题中 - 听起来你只是 XYZ 有一个特定问题 - 不管它是什么。以上是关于在 Xamarin.Android 和 MvvmCross 中定义应用程序类的基类的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin - 无法通过 Android(和 iOS)访问本地 api
dotnet 5 和 Xamarin Android:找不到导入的项目“Xamarin.Android.CSharp.targets”