MessageCenter xamarin 表单的 lambda 回调中未执行的方法

Posted

技术标签:

【中文标题】MessageCenter xamarin 表单的 lambda 回调中未执行的方法【英文标题】:Method not executed inside lambda callback of MessageCenter xamarin forms 【发布时间】:2020-05-05 21:56:27 【问题描述】:

我使用 MessageCenter 类将字符串从 android 本机代码传递到 Xamarin 共享代码。但我面临以下问题。在下面的代码中,我正在发送字符串,他们可以接收它,但是从 Action 委托中的表达式中,只有调试语句被执行,其他的则被忽略。

         public partial class Search : ContentPage




    public Search()
    
        InitializeComponent();

       






        MessagingCenter.Send<string>("xamarin", "FromAndroid");

        //receing msg from android shared intent between apps
        MessagingCenter.Subscribe<string>(this, "FromAndroid", (msg) =>
       

           searchBar.Text = msg;   // that line do not update my UI search text if is outside is 
        updated
           Debug.WriteLine("+++++++++++++++++++++++++++++++++++ " + msg);




       );


    












通常,Send 方法位于 Android 项目中,为了简洁起见,我将其移至此处。我可以确认订阅方法成功接收到“xamarin”字符串。

【问题讨论】:

UI 更新只能发生在主线程上。尝试使用 BeginInvokeOnMainThread 你的意思是像这样 Device.BeginInvokeOnMainThread(() => searchBar.Text = msg; );但它也不起作用我现在询问 Device.BeginInvokeOnMainThread 也在单独的线程中。 【参考方案1】:

根据你的描述和代码,我建议你可以尝试先订阅一个消息,然后发送到消息。

从您的代码中,您只需发送消息,然后订阅消息,因此您无法更新 UI。

我使用 ContentPage 构造函数中的代码,它仍然可以更改 UI。

<ContentPage.Content>
    <StackLayout>
        <Label x:Name="label1" />
    </StackLayout>
</ContentPage.Content>

 public  Page16()
    
        InitializeComponent();

        MessagingCenter.Subscribe<Page16, string>(this, "Xamarin", async (sender, arg) =>
        
            label1.Text = arg;
        );
        MessagingCenter.Send<Page16, string>(this,"Xamarin","this is test");

    

【讨论】:

【参考方案2】:

如果你想传递一个参数,你需要两个类型参数

MessagingCenter.Send<object, string>(this, "FromAndroid", "data");

MessagingCenter.Subscribe<object, string>(this, "FromAndroid", async (sender, arg) =>

    searchBar.Text = arg; 

【讨论】:

我要传递的参数是从订阅者那里收到的,问题是没有更新 UI。我试过 DisplayAlert();同样的故事。 什么参数?您发布的代码在您的 Send() 调用中不包含任何参数 我已完全删除我的代码并用您的代码替换它,但 searchBar.Text 仍然不受影响。 您可能还需要使用 InvokeOnMainThread。您肯定arg 中的值正在被Subscribe 接收吗? 是的 Debug.WriteLine 总是被执行并且值是正确的。我刚才也尝试用简单的按钮更改 UI 控件以尝试更改文本但失败了。

以上是关于MessageCenter xamarin 表单的 lambda 回调中未执行的方法的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin 表单 TabbedPage

Xamarin 和 Xamarin 表单的符号包(PDB 文件)

使用 Xamarin.Mobile 读取 Xamarin 表单中的联系人时出错

Xamarin 表单发送图像

xamarin 表单中全局不支持 pushasync 的解决方案是啥?

重复服务呼叫 - Xamarin 表单