3

MessagingCenter用来通过我的页面传递对象,从我的 LoginPage 到我的 MainPage。即使object已更新,当将其用于我的主页时,该对象似乎为空。

    public User sUser { get; set; }
    public MainPage()
    {
        InitializeComponent();

        MessagingCenter.Subscribe<LoginPage, User>(this, "currentUserMainPage", (obj, item) =>
        {
            sUser = item;
            Debug.WriteLine("User updated from mainPage: " + sUser.firstName);
        });

        MasterBehavior = MasterBehavior.Popover;

        MenuPages.Add((int)MenuItemType.Home, (NavigationPage)Detail);
    }

当我在更改页面之前检查对象时,即使它不再为空,它也会返回我为空。

public async Task NavigateFromMenu(int id)
    {
        if (!MenuPages.ContainsKey(id))
        {
            switch (id)
            {
                case (int)MenuItemType.Profile:
                    if(sUser == null)
                    {
                        MenuPages.Add(id, new NavigationPage(new LoginPage(sUser)));
                    }
                    else
                    {
                        MenuPages.Add(id, new NavigationPage(new ProfilePage(sUser)));
                    }
                    break;
            }
        }
    }

知道我在这里想念什么吗?

编辑:这是来自 LoginPage 的调用

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

        try
        {
            //perform login
             MessagingCenter.Send(this, "currentUserMainPage", aUser.User);
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        
    }
4

1 回答 1

1

首先,您可以查看 MessageCenter 文档:https ://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/messaging-center

在订阅和发送消息时,我们需要保持参数的数量和类型相同。

示例如下:

发布消息: MessagingCenter.Send<MainPage, string>(this, "Hi", "John");

订阅消息:

MessagingCenter.Subscribe<MainPage, string>(this, "Hi", async (sender, arg) =>
{
    await DisplayAlert("Message received", "arg=" + arg, "OK");
});

您会看到第一个参数是MainPage,第二个是string。发布或订阅时都需要设置。

另外,使用 MessageCenter 在不同的页面或类之间,可以使用object或 来替换MainPage

因此,共享代码可以修改如下:

订阅MessageCenterobject:_

MessagingCenter.Subscribe<object, User>(this, "currentUserMainPage", (obj, item) =>
{
    sUser = item;
    Debug.WriteLine("User updated from mainPage: " + sUser.firstName);
});

并发送消息object

MessagingCenter.Send<object,User>(this, "currentUserMainPage", aUser.User);
于 2020-07-01T01:25:13.473 回答