【问题标题】:Xamarin Forms: onAppearing() is not firing when loading the pageXamarin Forms:加载页面时未触发 onAppearing()
【发布时间】:2021-03-09 03:53:11
【问题描述】:

在我的项目中,我使用依赖服务来打开设备的位置。打开位置后,我需要修改 UI。我在 onAppearing() 上添加了 GPS 状态检查代码。 onAppearing 方法是初始触发并检查 GPS 状态。如果 GPS 状态关闭,则 UI 上将显示位置共享按钮。如果我们点击共享位置按钮,我会将用户重定向到设备位置设置页面。当用户在该位置后返回应用程序时,此时 onAppearing() 没有触发。

我的代码

protected override void OnAppearing()
{
    base.OnAppearing();
    ShareLocation();
}

public async void ShareLocation()
{
    var status = await Permissions.RequestAsync<Permissions.LocationAlways>();
    if (status == PermissionStatus.Granted)
    {
        bool gpsStatus = DependencyService.Get<ILocSettings>().isGpsAvailable();
        if (!gpsStatus)
        {
            location_sharing.IsVisible = true;
            location_sharing_on.IsVisible = false;
        }
        else
        {
            location_sharing_on.IsVisible = true;
            location_sharing.IsVisible = false;
        }
    }
}

按钮的点击事件

var myAction = await DisplayAlert("Location", "Please turn on GPS to get your current location for emergency response.", "TURN ON", "CANCEL");
if (myAction)
{
   DependencyService.Get<ILocSettings>().OpenSettings();
}

依赖服务:

    namespace projectName.Renderer
    {
       public interface ILocSettings
       {
          void OpenSettings();
          bool isGpsAvailable();
       }
     }

[assembly: Dependency(typeof(LocationShare))]
namespace projectName.Droid.Services
{
    public class LocationShare : ILocSettings
    {
        public bool isGpsAvailable()
        {
            bool value = false;
            Android.Locations.LocationManager manager = (Android.Locations.LocationManager)Android.App.Application.Context.GetSystemService(Android.Content.Context.LocationService);
            if (!manager.IsProviderEnabled(Android.Locations.LocationManager.GpsProvider))
            {
                //gps disable
                value = false;
            }
            else
            {
                //Gps enable
                value = true;
            }
            return value;
        }
        public void OpenSettings()
        {
            Intent intent = new Android.Content.Intent(Android.Provider.Settings.ActionLocationSourceSettings);
            intent.AddFlags(ActivityFlags.NewTask);
            Android.App.Application.Context.StartActivity(intent);
        }
    }
}

通常,onAppearing() 总是会在加载页面时执行。但我不知道这个页面上的问题是什么。在位置设置后加载页面时,onAppearing 不会触发。我附上了一个示例项目here

【问题讨论】:

  • 示例项目并不复杂。如果您下载项目并检查问题,那就是这样。
  • 我下载了,很好用
  • @ShubhamTyagi 我检查了样本。她的 UI 上有 2 个按钮。一个是“位置共享”按钮,另一个是“开启”按钮。从设置中打开位置后,她需要隐藏位置共享按钮并显示“打开”按钮。这是行不通的,因为当从设置返回应用程序时,onappearing 没有触发。
  • 问题是在点击分享位置按钮时会被重定向到用户位置设置页面,然后我们又回到了需要执行的onAppearing函数并更新UI的位置。我们在 onAppearing() 上添加了 GPS 状态检查代码。 onAppearing 方法最初执行并检查 GPS 状态。但是在回到 UI 之后 onAppearing() 没有触发。 @ShubhamTyagi

标签: xamarin.forms


【解决方案1】:

'OnAppearing' 方法在您从页面导航并从堆栈中的另一个页面返回该页面时触发。在您的情况下,您将应用程序置于睡眠状态,当您恢复应用程序时,不会调用 OnAppearing 事件,因为页面虽然已经存在,但尚未出现。

您可以使用 MessagingCenter 来实现您的目标。

App.xaml.cs

protected override void OnResume()
        {
            MessagingCenter.Send(this, "ShareLocation");
        }

MainPage.xaml.cs

protected override void OnAppearing()
        {
            base.OnAppearing();
            MessagingCenter.Subscribe<App>(this, "ShareLocation", (sender) =>
            {
                ShareLocation();
            });
            ShareLocation();
        }

        protected override void OnDisappearing()
        {
            base.OnDisappearing();
            MessagingCenter.Unsubscribe<App>(this, "ShareLocation");
        }

【讨论】:

    猜你喜欢
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多