0

我有一个 ZXing 扫描仪页面,我想从 ScanPageModel 获取扫描数据到 MyPageModel

我正在从 MyPageModel 打开扫描页面

public Command ScanCode
        {
            get
            {
                return new Command(async () =>
                {
                    MessagingCenter.Subscribe<MyPageModel>(this, "ScanText", (value) =>
                    {

                    });
                    await CoreMethods.PushPageModel<ScanPageModel>();

                });
            }
        }

从 ScanPageModel 获取扫描结果后发送消息中心数据

 private void ScanResultAction(object obj)
        {
            // Prevent multiple event triggers from triggering the navigation multiple times
            if (NavigatingAway)
                return;

            NavigatingAway = true;          
            var result = obj as ZXing.Result;
            var format = result?.BarcodeFormat.ToString() ?? string.Empty;
            var value = result?.Text ?? string.Empty;
            // Navigate to a page based on value
            SampleListData sa = new SampleListData();
            sa.Name = value;
            Device.BeginInvokeOnMainThread(async () =>
            {
                MessagingCenter.Send<ScanPageModel, string>(this, "ScanText", result.Text);
                await CoreMethods.PopPageModel();
            });
        } 

但是从 ScanPageModel 发送数据后我的消息中心没有调用这是接收扫描代码的订阅方法

public MyPageModel()
        {
            MessagingCenter.Subscribe<SampleListData>(this, "ScanText", (value) =>
            {

            });
        }

我也试着把这个订阅放在里面

 public override void Init(object initData)
        {
            MessagingCenter.Subscribe<SampleListData>(this, "ScanText", (value) =>
                {

                });
        }

但它也不起作用那么如何解决这个问题?

4

1 回答 1

0

您的订阅和发送方法不一样。您发送消息,但从不听它。另一方面,您正在订阅一条您从未发送过的消息。让我解释。

两种类型的消息

1. 简单字符串消息(不带参数):

订阅:

MessagingCenter.Subscribe<MainPage> (this, "MyMessage", (sender) => {
    // do something whenever the "MyMessage" message is sent
});

发送:

MessagingCenter.Send<MainPage> (this, "MyMessage");

2. 传递参数的消息:

订阅:

MessagingCenter.Subscribe<MainPage, string> (this, "MyMessageArg", (sender, arg) => {
    // do something whenever the "MyMessageArg" message is sent
    // using the 'arg' parameter which is a string
    string s = arg as string; // s = "John"
});

发送:

MessagingCenter.Send<MainPage, string> (this, "MyMessageArg", "John");

看看这两种类型的 <..> 里面是什么。在第二种类型中,还有您要发送的参数的数据类型。在您的示例中,您正在混合这两种类型。所以将您的订阅方法更改为:

MessagingCenter.Subscribe<SampleListData, string>(this, "ScanText", (sender, arg) =>{
     string data = arg as string;
     // do work
});

提示:

  • 不要有多个同名的订阅方法
  • 不要多次订阅同一个消息名!!因为如果您运行一次发送,它将触发您创建的每个订阅方法(这非常糟糕)。留意按钮点击或循环订阅。
  • 如果您要离开已订阅消息的页面,请取消订阅该消息(针对性能和错误)

退订

MessagingCenter.Unsubscribe<MainPage> (this, "MyMessage");
MessagingCenter.Unsubscribe<MainPage, string> (this, "MyMessageArg");
于 2018-12-03T10:07:57.363 回答