Xamarin Android 如何从另一个页面获取文本赋值给Entry组件
Xamarin.Forms Android端跨页面传参首次加载失效解决方案
问题原因
该问题由Xamarin.Forms双端差异导致:
- Android端
Preferences.Set底层默认使用Apply()异步持久化,存储完成前跳转第二页会读取到旧值 - Android端页面控件初始化渲染时机晚于
OnAppearing首次触发,直接给Entry组件赋值会被后续的控件初始属性覆盖
解决方案
方案1:构造方法传参(最推荐,无时序问题)
直接通过页面构造方法传递参数,规避持久化存储的同步问题:
- 第一页跳转逻辑修改:
// 原有存储逻辑可保留 Preferences.Set("cityName", _cityEntry.Text); // 跳转时直接传入参数 await Navigation.PushAsync(new AboutPage(_cityEntry.Text));
- 第二页代码调整:
public partial class AboutPage : ContentPage { RestServiceForecast _restServiceForecast; string _cityName; // 新增带参数构造方法 public AboutPage(string cityName) { InitializeComponent(); NavigationPage.SetHasNavigationBar(this, false); _restServiceForecast = new RestServiceForecast(); _cityName = cityName; } protected override void OnAppearing() { base.OnAppearing(); // 直接使用构造传入的参数,无需读取Preferences _cityEntry.Text = _cityName; _ = WeatherForecast(); } }
方案2:适配Android时序逻辑(必须使用Preferences传参时可选)
修改第二页OnAppearing逻辑,确保赋值在UI渲染完成、Preferences持久化完成后执行:
protected override async void OnAppearing() { base.OnAppearing(); // 短延迟等待Preferences持久化完成 await Task.Delay(10); // 强制在UI主线程赋值,避免控件未初始化导致赋值失效 Device.BeginInvokeOnMainThread(() => { string cityName = Preferences.Get("cityName", "default_value"); _cityEntry.Text = cityName; }); _ = WeatherForecast(); }
方案3:强制Preferences同步写入
修改第一页存储逻辑,Android端强制同步提交,确保跳转前存储完成:
Preferences.Set("cityName", _cityEntry.Text); // Android端强制同步持久化 #if ANDROID var context = Android.App.Application.Context; var sharedPrefs = context.GetSharedPreferences("Xamarin.Essentials.Preferences", Android.Content.FileCreationMode.Private); sharedPrefs.Edit().Commit(); #endif // 执行跳转逻辑 await Navigation.PushAsync(new AboutPage());
内容的提问来源于stack exchange,提问作者Ben Johnson
相关产品推荐
相关产品推荐

