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 和 Xamarin 表单的符号包(PDB 文件)
使用 Xamarin.Mobile 读取 Xamarin 表单中的联系人时出错