【问题标题】:Nested subscription to messages on xamarin forms嵌套订阅 xamarin 表单上的消息
【发布时间】:2021-06-11 10:04:19
【问题描述】:

我是 Xamarin 表单的新手,不知道如何处理这种情况。我尝试了多种方式来实现它,但都没有成功。

我有一个页面,当用户进行操作时(在文本框中写入文本并使用回车键发送),我的应用程序必须进行一些检查。根据检查的结果,可能需要显示一个模式页面,其中包含要选择的项目列表。用户进行选择过程必须继续进行其他检查。这是我的问题,因为在接下来的检查中,我必须显示另一个页面。用户必须进行选择/输入某个日期,然后继续完成该过程,但不会出现此页面。 我正在使用消息中心订阅模式页面。第一个模态页面出现并进行选择。第二个模态页面永远不会显示,然后进程永远不会完成。 这是我的一些代码:

                NavigationPage navigationPage = new NavigationPage(new ListItemsPage(products));
                Navigation.PushModalAsync(navigationPage);

                MessagingCenter.Subscribe<ListItemsPage, Guid?>(this, "Select product", (obj, item) =>
                {
                    try
                    {
                        if (item != null)
                        {
                            product = products.SingleOrDefault(x => x.Guid == item);
                            if (product != null) ProcessLine(product);
                        }                            
                    }
                    catch(Exception ex)
                    {
                        throw ex;
                    }
                    finally
                    {
                        MessagingCenter.Unsubscribe<ListItemsPage, Guid?>(this, "Select product");
                    }                       
                });

在 ListItemsPage 上,当项目被选中时,我有此代码:

private  void MenuItem_Clicked(object sender, EventArgs e)
    {
         // some logic...         
        Navigation.PopModalAsync();
        MessagingCenter.Send(this, "Select product", SelectedGuid);            

    }

SelectedGuid 是一个 Guid 类型的数据,当 debbugin 被很好地选择时。 使用 ProcessLine 方法时会出现问题。

private void ProcessLine(Product product) {
    // make some logic...
    NavigationPage navigationPage = new NavigationPage(new ControlUnitsPage(model));
    Navigation.PushModalAsync(navigationPage);
    
    MessagingCenter.Subscribe<ControlUnitsPage, ControlUnits>(this, "Select units, date and lot code", (obj, item) =>
    {
           try
                    {
                        if (item != null)
                        {
                            _date = item.Date;
                            _code = item.Code;
                            _units = item.Units;

                            Save(productLine, product, _units, _date,_code);
                        }
                    }
                    catch(Exception ex)
                    {
                        throw ex;
                    }
                    finally
                    {
                        MessagingCenter.Unsubscribe<ControlUnitsPage, ControlUnits>(this, "Select units, date and lot code");
                    }
                    
                });
   
 }

ControlUnitsPage 的结构与最后一页相同。首先创建一个 PopModalAsync,然后发送消息,发送 ControlUnits 类型的实例。

    private void Button_Clicked(object sender, EventArgs e)
    {
       //some logic...
       Item = new ControlUnits() { Date = DateField.Date, Code = CodeField.Text, Units = int.Parse(SelectedUnits.Value.ToString()) };
       Navigation.PopModalAsync();
       MessagingCenter.Send(this, "Select units, date and lot code", Item);         
    }

我认为问题在于调用方法的顺序,但不知道正确的顺序是什么,因为我无法理解 pushmodal、popmodal 方法是如何工作的,如果之后订阅,我是否应该使用 await .我真的不知道,我需要帮助。

非常感谢!

【问题讨论】:

  • ProcessLine中的Subscribe对应的Send方法在哪里?
  • 嗨杰森。我已经编辑了我的消息并添加了相应的发送方法。谢谢。

标签: xamarin.forms xamarin.android messagingcenter


【解决方案1】:

您的SendSubscribe 调用需要使用匹配参数

如果Subscribe 看起来像这样

MessagingCenter.Subscribe<ControlUnitsPage, ControlUnits>(this, "Select units, date and lot code", (obj, item) => ... );

那么Send需要匹配

MessagingCenter.Send<ControlUnitsPage, ControlUnits>(this, "Select units, date and lot code", Item);

【讨论】:

  • 两种方法的参数已经匹配。也许我可以使用与 MC 不同的方法?
  • SendSend&lt;ControlUnitsPage, ControlUnits&gt; 不同 - 通用类型参数也需要匹配
  • 我把论据和结果是一样的。当转到 ListItemsPage 时,我选择了一个项目,执行下一步但 ListItemsPage 没有消失,并且当进程完成时它仍然是该页面。我想我无法到达 ControlsUnitsPage 因为 ListItemsPage 不会关闭,所以最后一步,保存方法,从不执行...
  • 您在发送消息之前订阅消息了吗?
  • 我不确定,因为我创建了一个 PushModalAsync 来打开页面,并且在下一行我订阅了该消息。所以我不确定订阅是在 Send 方法之后还是之前执行的。我知道收到消息是因为选择后,订阅中的代码被执行但页面没有关闭。
猜你喜欢
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 2019-11-15
  • 2020-10-17
  • 2022-01-24
相关资源
最近更新 更多