在Maui注册兼容性PageRenderer导致堆栈溢出异常

问题描述 投票:0回答:1

我正在尝试重用 Xamarin.Forms 中的现有 PageRenderer

项目,采用迁移后的应用程序形式。

当页面开始加载时,我收到堆栈溢出异常:

Java.Interop.NativeMethods.java_interop_jnienv_call_nonvirtual_void_method_a 中的 0x39 C# /Users/runner/work/1/s/xamarin-android/external/Java.Interop/src/Java.Interop/obj/Release/net7.0/JniEnvironment.g 处的 Java.Interop.JniEnvironment.InstanceMethods.CallNonvirtualVoidMethod 中的 0x74 .cs:12320,4 C# Java.Interop.JniPeerMembers.JniInstanceMethods.InvokeNonvirtualVoidMethod 中的 0x2D /Users/runner/work/1/s/xamarin-android/external/Java.Interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods_Invoke.cs:93 ,6 C# Android.Views.ViewGroup.Layout 中的 0x69 /Users/runner/work/1/s/xamarin-android/src/Mono.Android/obj/Release/net7.0/android-33/mcw/Android.Views.ViewGroup .cs:3369,5 C# 0xD4 在 Microsoft.Maui.ViewHandlerExtensions.PlatformArrangeHandler 位于 D: _work \s\src\Core\src\Handlers\ViewHandlerExtensions.Android.cs:133,4 C# 0x2 在 Microsoft.Maui.Handlers.ViewHandler.PlatformArrange 位于 D: _work \s\src\Core\src\Handlers\View\ViewHandlerOfT.Android.cs:15,4 C# 0x37 在 Microsoft.Maui.Controls.Compatibility.RendererToHandlerShim.PlatformArrange 位于 D: _work \s\src\Compatibility\Core\src\RendererToHandlerShim.Android.cs:51,4 C# 0x1F 在 Microsoft.Maui.Controls.ContentPage.ArrangeOverride 位于 D: _work \s\src\Controls\src\Core\HandlerImpl\ContentPage.Impl.cs:22,4 C# 0x2 在 Microsoft.Maui.Controls.VisualElement.Microsoft.Maui.IView.Arrange 位于 D: _work \s\src\Controls\src\Core\HandlerImpl\VisualElement\VisualElement.Impl.cs:111,4 C# 0x4F 在 Microsoft.Maui.Controls.Compatibility.Platform.Android.PageRenderer.OnLayout 位于 D: _work \s\src\Compatibility\Core\src\Android\Renderers\PageRenderer.cs:169,4 C# 0x10 在 Microsoft.Maui.MauiViewGroup.n_OnLayout_ZIIII 位于 D: _work \s\src\Core\src\obj\Release et7.0-android\ generated\src\Microsoft.Maui.MauiViewGroup.cs:206,4 C# Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PPZIIII_V 中的 0x11 位于 /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs:429,5 C#

我尝试注释渲染器的代码,但没有帮助:

    using Android.Content;
    using System;
    using Microsoft.Maui.Controls.Platform;
    using Microsoft.Maui.Controls;
    using Microsoft.Maui.Controls.Compatibility.Platform.Android;
    using PetActivityMobile.Core;
    using Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific;

    namespace PetActivityMobile.Droid.Renderers
    {
    public class CreateAccountViewRenderer : PageRenderer
    {
        private bool _initialized;
        private Page _page;

        public CreateAccountViewRenderer(Context context) : base(context)
        {

        }

        protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
        {
            if (!_initialized && e?.NewElement != null)
            {
                _initialized = true;
                _page = e.NewElement;

                //The appearing event invoke before OnElementChanged called.
                //So I'm changing the keyboard behavior also here for the first time when page up.
                App.Current.On<Microsoft.Maui.Controls.PlatformConfiguration.Android>().UseWindowSoftInputModeAdjust(WindowSoftInputModeAdjust.Pan);

                _page.Appearing -= OnAppearing;
                _page.Appearing += OnAppearing;
                _page.Disappearing -= OnDisappearing;
                _page.Disappearing += OnDisappearing;
            }
        }

        protected override void OnDetachedFromWindow()
        {
            _page.Appearing -= OnAppearing;
            _page.Disappearing -= OnDisappearing;
            _initialized = false;
        }

        private void OnAppearing(object sender, EventArgs e)
        {
            App.Current.On<Microsoft.Maui.Controls.PlatformConfiguration.Android>().UseWindowSoftInputModeAdjust(WindowSoftInputModeAdjust.Pan);
        }

        private void OnDisappearing(object sender, EventArgs e)
        {
            App.Current.On<Microsoft.Maui.Controls.PlatformConfiguration.Android>().UseWindowSoftInputModeAdjust(WindowSoftInputModeAdjust.Resize);
        }
    }
}

我将它包含在我的 Android 项目中,如下所示:

private void RegisterRenderers(MauiAppBuilder mauiApp)
{
    mauiApp.ConfigureMauiHandlers((handlers) =>
    {
        handlers.AddCompatibilityRenderer(typeof(MyEntry), typeof(MyRenderer));
        handlers.AddCompatibilityRenderer(typeof(CreateAccountView), typeof(CreateAccountViewRenderer));
    });
}

Entry 的渲染器工作正常。

有人也尝试过重用毛伊岛 xamarin.forms 的页面渲染器吗?

c# .net maui
1个回答
0
投票

由于

PageRenderer
在毛伊岛已过时,您可以尝试使用相应的处理程序/映射器。

您可以参考以下Handler:

public class ContentPageHandler : Microsoft.Maui.Handlers.PageHandler
{
    protected override void ConnectHandler(Microsoft.Maui.Platform.ContentView nativeView)
    {
        base.ConnectHandler(nativeView);
        ContentPage.Loaded += OnLoaded;
    }

    protected override void DisconnectHandler(Microsoft.Maui.Platform.ContentView nativeView)
    {
        ContentPage.Loaded -= OnLoaded;
        base.DisconnectHandler(nativeView);
    }

    ContentPage ContentPage => VirtualView as ContentPage;

    void OnLoaded(object sender, EventArgs e) => ConfigureInteractivePopGesture();

    void ConfigureInteractivePopGesture()
    {
        if (this is IPlatformViewHandler handler && handler.ViewController?.ParentViewController?.NavigationController is UIKit.UINavigationController navControler)
        {
            navControler.NavigationBarHidden = true;
            navControler.InteractivePopGestureRecognizer.Delegate = new GestureRecognizerDelegate();
            navControler.InteractivePopGestureRecognizer.Enabled = true;
        }
    }
}

public class GestureRecognizerDelegate : Foundation.NSObject, UIKit.IUIGestureRecognizerDelegate
{

}

并在

MauiProgram.cs
中注册:

public static MauiApp CreateMauiApp()
    {
        return MauiApp.CreateBuilder()
            .UseMauiApp<App>()
#if IOS
            .ConfigureMauiHandlers(handlers =>
            {
                handlers.AddHandler(typeof(ContentPage), typeof(ContentPageHandler));
            })
#endif
            .Build();
    }

注:

1.有一个关于此的已知问题,您可以在这里检查:PageRenderer 兼容性未渲染页面内容

2.有关更多信息,请查看文档:将 Xamarin.Forms 自定义渲染器迁移到 .NET MAUI 处理程序

© www.soinside.com 2019 - 2024. All rights reserved.