Ala*_*an2 7 c# xamarin xamarin.forms
我最近看到了这个关于如何将应用程序 OnStart 变成异步 OnStart 的建议:
protected override void OnStart()
{
this.started += onStarted; //Subscribe to event
started(this, EventArgs.Empty); //Raise event
}
protected async void onStarted(object sender, EventArgs args)
{
try
{
await // do things
}
catch (Exception ex)
{
var ignore = ex;
}
this.started -= onStarted;
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以看到任何可能的问题,如果没有,那么类似的东西可以应用于 OnAppearing,如果是这样,是否需要进行任何更改。
OnAppearing只是voidPage 类上的一个方法
Xamarin.Forms.Page
//...
protected virtual void OnAppearing()
{
}
//...
Run Code Online (Sandbox Code Playgroud)
这被称为页面生命周期的一部分。
//...
[EditorBrowsable(EditorBrowsableState.Never)]
public void SendAppearing()
{
if (_hasAppeared)
return;
_hasAppeared = true;
if (IsBusy)
{
if (IsPlatformEnabled)
MessagingCenter.Send(this, BusySetSignalName, true);
else
_pendingActions.Add(() => MessagingCenter.Send(this, BusySetSignalName, true));
}
OnAppearing(); //<---
Appearing?.Invoke(this, EventArgs.Empty); //NOTE HOW ACTUAL EVENT IS RAISED AFTER
var pageContainer = this as IPageContainer<Page>;
pageContainer?.CurrentPage?.SendAppearing();
FindApplication(this)?.OnPageAppearing(this);
}
//...
Run Code Online (Sandbox Code Playgroud)
它们不会被误认为是事件处理程序,这是允许使用的一种异常async void。
您的OnStart示例中显示的方法也可以应用于OnAppearing
例如
public partial class SomePage : ContentPage {
public SomelPage() {
InitializeComponent();
appearing += onAppearing;
}
protected override void OnAppearing() {
appearing(this, EventArgs.Empty);
appearing -= onAppearing;
}
event EventHandler appearing = delegate { };
private async void onAppearing(object sender, EventArgs args) {
try {
var locator = CrossGeolocator.Current;
var position = await locator.GetPositionAsync();
var places = await SomeService.getPlacesOfInterest(position.Latitude, position.Longitude);
placesListView.ItemsSource = places;
} catch( Exception ex) {
//handler error (Log?)
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者您可以直接订阅实际 Appearing事件
//...
public event EventHandler Appearing;
//...
Run Code Online (Sandbox Code Playgroud)
并放弃覆盖该OnAppearing()方法
public partial class SomePage : ContentPage {
public SomelPage() {
InitializeComponent();
Appearing += onAppearing;
}
private async void onAppearing(object sender, EventArgs args) {
try {
var locator = CrossGeolocator.Current;
var position = await locator.GetPositionAsync();
var places = await SomeService.getPlacesOfInterest(position.Latitude, position.Longitude);
placesListView.ItemsSource = places;
} catch( Exception ex) {
//handler error (Log?)
}
}
}
Run Code Online (Sandbox Code Playgroud)