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。您需要做的就是在弹出窗口消失时向您的内容页面发送一条消息。它有点额外的工作和意大利面,但目前它确实是唯一的方法。
显然,即将推出的一些附加功能可能有助于解决此问题,但目前没有什么可做的。
当你调用你的
1 2 3 | button.Clicked += async (sender, e) => await Navigation.PopModalAsync(); button.Clicked += async (sender, e) => await Navigation.PushModalAsync(new PopModalBug ()); |