【问题标题】:Cannot display an alert on app launch Xamarin Forms无法在应用启动时显示警报 Xamarin Forms
【发布时间】:2019-08-22 09:10:15
【问题描述】:

我正在开发一个 Xamarin Forms 应用程序,我想在启动时执行一些操作。我要调用的部分方法负责检查是否满足某些条件,如果不满足,我想显示警报(使用 DisplayAlert 方法)以通知用户他/她应该采取的操作以允许正确应用程序功能的执行。不幸的是,在 Android 上没有显示警报,它并不总是发生,有时它会显示,但在大多数情况下它不会。在做了一些研究之后,我认为这个问题可能与线程有关。我添加了一些断点,我注意到在 Android 上,负责显示警报的代码行在页面变得可见之前正在执行。在 iOS 上一切正常(当显示大约一半的 UI 时会显示警报)。我试图从主线程执行所有内容。在 Android 上它有部分帮助,警报在更多情况下正确显示,尽管我仍然没有达到 100% 的准确度。此外,在 iOS 上,提到的更改会导致应用卡在启动画面上。下面是我尝试使用的两个版本的代码。

首先是我开始使用的基本代码:

    public partial class App : Application
    {
        MainPage mainPage;
        public static string DatabaseLocation = string.Empty;

        public App(string databaseLocation)
        {
            //All of the UI code is written in C# in MainPage initializer
            mainPage = new MainPage();
            MainPage = new NavigationPage(mainPage);
            DatabaseLocation = databaseLocation;
        }



        protected override async void OnStart()
        {
            base.OnStart();

            //in DoThings there is a code containing DisplayAlert
            await mainPage.DoThings();
        }
    }

以下是我尝试将所有内容放在主线程上的代码版本:

public partial class App : Application
    {
        MainPage mainPage;
        public static string DatabaseLocation = string.Empty;

        public App(string databaseLocation)
        {
            Device.BeginInvokeOnMainThread(() =>
            {
                mainPage = new MainPage();
                MainPage = new NavigationPage(mainPage);
            });
            DatabaseLocation = databaseLocation;

        }



        protected override async void OnStart()
        {
            base.OnStart();

            Device.BeginInvokeOnMainThread(async () =>
            await mainPage.DoThings());
        }
    }

我还尝试从主线程运行专门负责显示警报的代码行,但它也没有帮助。 DoThings 是 MainPage 中的一个方法。

public async Task DoThings() {

  if (somethingMissing()){
    Device.BeginInvokeOnMainThread(async () =>
      await DisplayAlert("Error", "Fix errors", "Ok"));
  }
  else
  {
    DoStuff();
  }
}

【问题讨论】:

    标签: c# android ios multithreading xamarin


    【解决方案1】:

    在 MainPage 你可以试试这个代码

    public async Task DoThings() {
    
      if (somethingMissing()){
        Device.BeginInvokeOnMainThread(async () =>
          await App.Current.MainPage.DisplayAlert("Error", "Fix errors", "Ok"));
      }
      else
      {
        DoStuff();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      相关资源
      最近更新 更多