关于 xamarin.android:Xamarin Forms Android OnAppearing 在 PopModalAsync 后未触发

Xamarin Forms Android OnAppearing Not Triggering After PopModalAsync

在调用 PopModalAsync 后仍然使用模态页面时,Android 没有触发的解决方法。这是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System;
using Xamarin.Forms;

namespace XamarinForms
{
    public class OnAppearingBug : ContentPage
    {
        Label label;
        public OnAppearingBug ()
        {
            label = new Label {
                Text ="Page"
            };
            Button button = new Button {
                Text ="PushModal"
            };
            button.Clicked += (sender, e) => Navigation.PushModalAsync (new PopModalBug ());

            Content = new StackLayout {
                Children = { label, button }
            };
        }
        protected override void OnAppearing(){
            label.Text ="OnAppearing";
        }
    }
}

using System;
using Xamarin.Forms;

namespace XamarinForms
{
    public class PopModalBug : ContentPage
    {
        public PopModalBug ()
        {
            Button button = new Button {
                Text ="Pop Back"
            };
            //Bug: This will not trigger OnAppearing on Android
            button.Clicked += (sender, e) => Navigation.PopModalAsync();

            Content = new StackLayout {
                Children = { button }
            };
        }
    }
}


另请参阅 http://forums.xamarin.com/discussion/21417/navigationpage-push-pop-event-sequence-different-across-platforms 和 http://forums.xamarin.com/discussion/18781/ios -and-android-different-behaviors-for-onappearing

但目前(Xamarin.Forms 1.2.2)唯一/最好的解决方案是上面 CrisWebb 提出的解决方案:

在您的主页上 -
MessagingCenter.Subscribe(this, "popped", (sender) =>
{
// 要运行的代码
});

在您的模态页面上 -
MessagingCenter.Send(this, "popped");


这是 keith_r 指出的问题。

作为 MessagingCenter 的替代方案,您可以使用在模式页面被推送或弹出时触发的 Xamarin.Forms.Application 事件。

此处描述的应用程序事件。

在您的 Xamarin.Forms.Application MyApp 类中,您可以保留 OnAppearingBug 页面的句柄。在 MyApp 中,您可以根据需要监听模式页面推送/poppig 和命令 OnAppearingBug Page。


有一个简单的解决方法。例如,我的模式页面是一个日历,用户必须在 POP 之前选择一个日期。

所以,在 Modal Page 类中创建一个事件(在我的例子中是 OnDateSelected)
并从其父页面创建引用。


或者你可以使用 pushModalAsync 方法直接导航到一个页面。


我现在实际上遇到了同样的问题。它非常令人沮丧,因为甚至没有办法使用自定义渲染器滚动您自己的,因为所有表单页面都被认为是 android 上的一个活动,因此它根本不会收到任何生命周期通知。

我找到的唯一解决方案是使用 MessagingCenter。您需要做的就是在弹出窗口消失时向您的内容页面发送一条消息。它有点额外的工作和意大利面,但目前它确实是唯一的方法。

显然,即将推出的一些附加功能可能有助于解决此问题,但目前没有什么可做的。


当你调用你的 Async 方法时不要忘记 await,例如,按钮点击应该是这样的:

1
2
3
    button.Clicked += async (sender, e) => await Navigation.PopModalAsync();

    button.Clicked += async (sender, e) => await Navigation.PushModalAsync(new PopModalBug ());