如何解决MVVMCross Android 应用程序崩溃 - System.Reflection.AmbiguousMatchException: Ambiguous match found
从 MvvmCross 5 切换到 7 后,我在移动到此页面后立即在 enum Error: String,Swift.Error {
case badURL = "Bad URL"
private var errorCode: Int {
switch self {
case .badURL:
return 100 // your error code
}
}
var foundationError: NSError {
return NSError(domain: "com.myAppPackageName",code: errorCode,userInfo: [
NSLocalizedDescriptionKey : self.rawValue
])
}
}
...
completionHandler(nil,Error.badURL.foundationError)
...
处收到 AmbiguousMatchException
,但我无法弄清楚原因是什么或如何解决解决这个问题。相同的代码以前可以使用,但现在不行了。
我尝试删除 set.Apply();
函数并删除了崩溃异常,但随后地址字段为空(与添加 try catch 的效果相同)。我也尝试只绑定 4 个中的一个,但仍然出现异常。
以下是所有异常详情:
set.Bind
这是无法工作的片段上的代码
[AppCenterCrashes] Unhandled Exception from source=AndroidEnvironment
[AppCenterCrashes] System.Reflection.AmbiguousMatchException: Ambiguous match found.
[AppCenterCrashes] at System.RuntimeType.GetPropertyImpl (System.String name,System.Reflection.BindingFlags bindingAttr,System.Reflection.Binder binder,System.Type returnType,System.Type[] types,System.Reflection.ParameterModifier[] modifiers) [0x00057] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/referencesource/mscorlib/system/rttype.cs:3344
[AppCenterCrashes] at System.Type.GetProperty (System.String name,System.Reflection.BindingFlags bindingAttr) [0x0000e] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/Common/src/CoreLib/System/Type.cs:231
[AppCenterCrashes] at System.Type.GetProperty (System.String name) [0x00000] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/Common/src/CoreLib/System/Type.cs:226
[AppCenterCrashes] at MvvmCross.Binding.Bindings.Target.Construction.MvxTargetBindingFactoryRegistry.TryCreateReflectionBasedBinding (System.Object target,System.String targetName,MvvmCross.Binding.Bindings.Target.IMvxTargetBinding& binding) [0x00024] in /_/MvvmCross/Binding/Bindings/Target/Construction/MvxTargetBindingFactoryRegistry.cs:45
[AppCenterCrashes] at MvvmCross.Binding.Bindings.Target.Construction.MvxTargetBindingFactoryRegistry.CreateBinding (System.Object target,System.String targetName) [0x0000e] in /_/MvvmCross/Binding/Bindings/Target/Construction/MvxTargetBindingFactoryRegistry.cs:22
[AppCenterCrashes] at MvvmCross.Binding.Bindings.MvxFullBinding.CreateTargetBinding (System.Object target) [0x00000] in /_/MvvmCross/Binding/Bindings/MvxFullBinding.cs:146
[AppCenterCrashes] at MvvmCross.Binding.Bindings.MvxFullBinding..ctor (MvvmCross.Binding.MvxBindingRequest bindingRequest) [0x00028] in /_/MvvmCross/Binding/Bindings/MvxFullBinding.cs:59
[AppCenterCrashes] at MvvmCross.Binding.Binders.MvxFromTextBinder.BindSingle (MvvmCross.Binding.MvxBindingRequest bindingRequest) [0x00000] in /_/MvvmCross/Binding/Binders/MvxFromTextBinder.cs:52
[AppCenterCrashes] at MvvmCross.Binding.Binders.MvxFromTextBinder+<>c__displayClass2_0.<Bind>b__0 (MvvmCross.Binding.Bindings.MvxBindingDescription description) [0x00000] in /_/MvvmCross/Binding/Binders/MvxFromTextBinder.cs:34
[AppCenterCrashes] at System.Linq.Enumerable+SelectArrayIterator`2[TSource,TResult].MoveNext () [0x0003a] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.Linq/src/System/Linq/Select.cs:224
[AppCenterCrashes] at MvvmCross.Binding.BindingContext.MvxBindingContextOwnerExtensions.AddBinding (MvvmCross.Binding.BindingContext.IMvxBindingContextOwner view,System.Object target,MvvmCross.Binding.Bindings.MvxBindingDescription bindingDescription,System.Object clearKey) [0x0000b] in /_/MvvmCrxt.MvxBindingContextOwnerExtensions.AddBindings (MvvmCross.Binding.BindingContext.IMvxBindingContextOwner view,System.Collections.Generic.IEnumerable`1[T] bindings,System.Object clearKey) [0x0001d] in /_/MvvmCross/Binding/BindingContext/MvxBindingContextOwnerExtensions.cs:61
[AppCenterCrashes] at MvvmCross.Binding.BindingContext.MvxBindingContextOwnerExtensions.AddBindings (MvvmCross.Binding.BindingContext.IMvxBindingContextOwner view,System.Collections.Generic.IEnumerable`1[T] bindingDescriptions,System.Object clearKey) [0x00018] in /_/MvvmCross/Binding/BindingContext/MvxBindingContextOwnerExtensions.cs:82
[AppCenterCrashes] at MvvmCross.Binding.BindingContext.MvxBindingContextOwnerExtensions.AddBinding (MvvmCross.Binding.BindingContext.IMvxBindingContextOwner view,System.Object clearKey) [0x0000b] in /_/MvvmCross/Binding/BindingContext/MvxBindingContextOwnerExtensions.cs:75
[AppCenterCrashes] at MvvmCross.Binding.BindingContext.MvxBaseFluentBindingDescription`1[TTarget].Apply () [0x00007] in /_/MvvmCross/Binding/BindingContext/MvxBaseFluentBindingDescription.cs:277
[AppCenterCrashes] at MvvmCross.Binding.BindingContext.MvxFluentBindingDescriptionSet`2[TOwningTarget,TSource].Apply () [0x00016] in /_/MvvmCross/Binding/BindingContext/MvxFluentBindingDescriptionSet.cs:65
[AppCenterCrashes] at Mobile.Droid.Fragments.MoveProfile.MoveProfileMoveDetailsFragment.SetBinding () [0x00098] in /Users/macbookpro/Documents/GitHub/Mobile/Mobile.Droid/Fragments/Mov
[Mono] Requesting loading reference 5 (of 6) of /storage/emulated/0/Android/data/com.saamer/files/.__override__/Microsoft.AppCenter.Crashes.dll
[Mono] Loading reference 5 of /storage/emulated/0/Android/data/com.saamer/files/.__override__/Microsoft.AppCenter.Crashes.dll asmctx DEFAULT,looking for System.Core,Version=2.0.5.0,Culture=neutral,PublicKeyToken=7cec85d7bea7798e
[Mono] Assembly Ref addref Microsoft.AppCenter.Crashes[0xf0db4940] -> System.Core[0xf0d90d40]: 16
[AppCenterCrashes] Saving uncaught exception.
[AppCenterCrashes] Saved JSON content for ingestion into /data/user/0/com.saamer/files/error/82c8d389-5698-4779-bb4e-aea8a9689bcf.json
[AppCenterCrashes] Saved empty Throwable file in /data/user/0/com.saamer/files/error/82c8d389-5698-4779-bb4e-aea8a9689bcf.throwable
[AppCenterCrashes] Saved raw wrapper exception data into /data/user/0/com.saamer/files/error/82c8d389-5698-4779-bb4e-aea8a9689bcf.dat
[Mono] DllImport searching in: '__Internal' ('(null)').
[Mono] Searching for 'java_interop_jnienv_throw'.
[Mono] Probing 'java_interop_jnienv_throw'.
更令人惊讶的是,编辑页面看起来几乎一模一样,而且效果很好。这是布局:
using Android.OS;
using Android.Runtime;
using Android.Views;
using Mobile.viewmodels.viewmodels.MoveProfile;
using MvvmCross.Binding.BindingContext;
using MvvmCross.Platforms.Android.Binding.BindingContext;
using MvvmCross.Platforms.Android.Views.Fragments;
namespace Mobile.Droid.Fragments.MoveProfile
{
[Register("mobile.droid.fragments.moveprofile.MoveProfileMoveDetailsFragment")]
public class MoveProfileMoveDetailsFragment : MvxFragment
{
private AddressInfoFragment _addressFragment;
private AddressInfoFragment _renteraddressFragment;
private AddressInfoFragment _mailingAddressFragment;
private AddressInfoFragment _destinationAddressFragment;
public override View OnCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState)
{
var ignored = base.OnCreateView(inflater,container,savedInstanceState);
var view = this.BindingInflate(Resource.Layout.fragment_move_profile_move_details,null);
AddFragments();
SetBinding();
return view;
}
private void AddFragments()
{
_addressFragment = new AddressInfoFragment();
_renteraddressFragment = new AddressInfoFragment();
_mailingAddressFragment = new AddressInfoFragment();
_destinationAddressFragment = new AddressInfoFragment();
var ft = Activity.SupportFragmentManager.BeginTransaction();
ft.Replace(Resource.Id.address_fragment,_addressFragment);
ft.Replace(Resource.Id.renter_address_fragment,_renteraddressFragment);
ft.Replace(Resource.Id.mailing_address_fragment,_mailingAddressFragment);
ft.Replace(Resource.Id.destination_address_fragment,_destinationAddressFragment);
ft.Commit();
}
private void SetBinding()
{
var owner = this as IMvxBindingContextOwner;
var set = owner.CreateBindingSet<IMvxBindingContextOwner,MoveProfileMoveDetailsviewmodel>();
set.Bind(_addressFragment).For(fr => fr.viewmodel).To(vm => vm.AddressInfoAddressviewmodel);
set.Bind(_renteraddressFragment).For(fr => fr.viewmodel).To(vm => vm.RenteraddressInfo);
set.Bind(_mailingAddressFragment).For(fr => fr.viewmodel).To(vm => vm.MailingAddressInfo);
set.Bind(_destinationAddressFragment).For(fr => fr.viewmodel).To(vm => vm.DestinationAddressInfo);
set.Apply(); //Crash here
}
}
}
我不知道从哪里开始调试这个问题,所以任何帮助将不胜感激。我尝试了几件事,但到目前为止都是徒劳的。
解决方法
好的,多亏了 Darius,我才能找到解决办法!我将 Fragment 精简到它的基础知识,而不是 FrameLayout,而是使用了 MvxFrameControl 并且它起作用了。所以这就是我的 Fragment 的样子:
using Android.OS;
using Android.Runtime;
using Android.Views;
using Mobile.ViewModels.ViewModels.MoveProfile;
using MvvmCross.Platforms.Android.Binding.BindingContext;
using MvvmCross.Platforms.Android.Views.Fragments;
namespace Mobile.Droid.Fragments.MoveProfile
{
[Register("mobile.droid.fragments.moveprofile.MoveProfileMoveDetailsFragment")]
public class MoveProfileMoveDetailsFragment : MvxFragment<MoveProfileMoveDetailsViewModel>
{
public override View OnCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState)
{
var ignored = base.OnCreateView(inflater,container,savedInstanceState);
var view = this.BindingInflate(Resource.Layout.fragment_move_profile_move_details,null);
return view;
}
}
}
而不是在我的布局中:
<FrameLayout
android:id="@+id/address_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
我用过这个:
<MvxFrameControl
local:MvxBind="DataContext AddressInfoAddressViewModel"
local:MvxTemplate="@layout/fragment_address_info"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。