微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MVVMCross Android 应用程序崩溃 - System.Reflection.AmbiguousMatchException: Ambiguous match found

如何解决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 举报,一经查实,本站将立刻删除。