Application.Current<PageName>返回null

问题描述

我正在使用MVVM模型在Xamarin.Forms中开发一个应用程序,并且在PageService类中使用此方法displayAlert在整个viewmodel中显示警报:

public async Task displayAlert(string title,string message,string ok = "ok")
{
    await Application.Current.MainPage.displayAlert(title,message,ok);
}

一切正常,因为我在测试设备上重新安装了应用程序,并做了一些较小的更改,这些更改不应影响MainPage。现在,每当我调用displayAlert方法时,都会引发异常:

System.NullReferenceException:“对象引用未设置为对象的实例。”

Xamarin.Forms.Application.MainPage.get返回null

我真的不知道错误是从哪里来的。我四处搜寻,发现的唯一发现是MainPage构造函数中可能存在一些问题,但就我而言,我什么都看不到。

因此,我现在陷入困境,不知道如何解决该问题。您能不能至少向我指出如何找出MainPage为什么返回null的方向?

非常感谢任何人的答复,非常感谢您的建议。

关于, 本沙

解决方案:

干杯,谢谢大家!我终于设法解决了这个问题: 因此,我有一个由Lucas Zhang建议编辑的App的构造函数,并在那里添加了两个断点:

public static Page RootPage { get; set; }
public App()
{
    InitializeComponent();
    MainPage = new MainPage();  //Breakpoint 1
    App.RootPage = MainPage;    //Breakpoint 2
}

我发现,该代码的执行过程如下:Debbuger在断点1处停止,然后在调试器到达断点2之前引发异常。 现在,MainPage实际上是由4个其他选项卡组成的选项卡式页面,并且在“ MainPage = new MainPage();”时初始化所有这些选项卡。叫做。在这些选项卡之一中,我使用了一项服务。该服务的作用基本上是:初始化自身并确定用户是否已执行某项操作,如果未执行,则显示警告,提示用户执行此操作。而且所有这些操作都是在MainPage完成其初始化之前发生的,因此当然在调用App.Current.MainPage null时会返回。

就是这样,再次谢谢大家!

解决方法

确保已在App的构造函数中设置了 MainPage

type Vacancies struct {
    ID int `json:"id"`
    Title string `json:"title"`
    Logo string `json:"logo"`
    Items []string `json:"items"`
}

func (r *repository) GetVacancies(ctx context.Context) []*Vacancies {
    const queryString = "select json_object('id',vd.id,'title',vd.title,'logo',vd.logo,'items',json_array((select GROUP_CONCAT(json_object('id',id,title,'description',description)) from vacancies as v where department_id = vd.id order by vd.sort))) from vacancy_departments as vd order by vd.sort"
    defer utils.StartRelicDatastoreSegment(
        ctx,newrelic.DatastoreMySQL,"Vacancies.GetVacancies","Select",queryString,).End()

    var result []*Vacancies
    if err := mysql.Client().Slave().Select(&result,queryString); err != nil {
        logger.Get().Error("err while getting vacancies",zap.Error(err))
        return nil
    }

    return result
}

如果仍然无法使用,则可以首先使用以下解决方法。

public App()
{
  InitializeComponent();

  MainPage = new xxxPage();

}

并引用

public static Page RootPage;

public App()
{
  InitializeComponent();

  MainPage = new MainPage();

  App.RootPage = this.MainPage;
}