Xamarin关注/取消关注功能Switch逻辑下页面刷新状态失效问题
问题根因
你的代码采用了「先更新本地状态再发网络请求」的「乐观更新」逻辑,但没有校验网络请求的实际结果,取消关注的接口请求大概率实际调用失败,服务端没有更新关注状态,页面刷新时拉取服务端的最新数据就会恢复成已关注状态,本地的UI更新和Toast提示只是给了用户操作成功的错觉。
具体问题点
- 异步请求未校验结果:
PollyController.RunRetryPolicyFunction执行的FollowUnFollowUserAsync是异步方法,你当前的写法是「发完就不管」,既没有等待请求返回,也没有判断接口是否调用成功,就算接口报错/超时,本地状态和UI还是会更新。 - 未做防重复点击:按钮点击后没有临时禁用,短时间多次点击可能导致请求错乱。
- 没有失败兜底逻辑:请求失败后没有恢复原有状态,也没有给用户错误提示。
修复方案
1. 修改点击逻辑,接口请求成功后再更新本地状态
调整执行顺序,先发起请求,确认请求成功后再更新UI、本地状态和全局缓存,示例代码如下:
try { // 先判断当前要执行的操作:true=关注,false=取消关注 bool isFollowOp = BtnFollow?.Tag?.ToString() == "Add"; // 临时禁用按钮,防止重复点击 BtnFollow.Enabled = false; // 等待请求执行完成,根据你实际的返回结构判断是否成功 var apiResult = await PollyController.RunRetryPolicyFunction(() => RequestsAsync.User.FollowUnFollowUserAsync(UserId, isFollowOp)); // 此处替换为你项目里接口返回成功的判断条件 if (apiResult != null && apiResult.IsSuccess) { if (isFollowOp) { // 关注成功更新状态 BtnFollow.SetColor(Color.ParseColor(AppSettings.MainColor)); BtnFollow.SetImageResource(Resource.Drawable.ic_tick); BtnFollow.Tag = "friends"; DataUser.IsFollowing = true; Toast.MakeText(Context, Context.GetText(Resource.String.Lbl_Sent_successfully_followed), ToastLength.Short)?.Show(); } else { // 取消关注成功更新状态 BtnFollow.SetColor(Color.ParseColor("#444444")); BtnFollow.SetImageResource(Resource.Drawable.ic_add); BtnFollow.Tag = "Add"; DataUser.IsFollowing = false; Toast.MakeText(Context, Context.GetText(Resource.String.Lbl_Sent_successfully_Unfollowed), ToastLength.Short)?.Show(); } // 更新全局列表缓存 var dataUser = GlobalContext?.MainFragment?.ArtistsAdapter?.ArtistsList?.FirstOrDefault(a => a.Id == DataUser.Id); if (dataUser != null) { dataUser.IsFollowing = DataUser.IsFollowing; GlobalContext.MainFragment.ArtistsAdapter.NotifyDataSetChanged(); } } else { // 接口返回失败,提示用户 Toast.MakeText(Context, "操作失败,请稍后重试", ToastLength.Short)?.Show(); } // 恢复按钮可点击 BtnFollow.Enabled = true; } catch (Exception exception) { Methods.DisplayReportResultTrack(exception); Toast.MakeText(Context, "操作失败,请稍后重试", ToastLength.Short)?.Show(); BtnFollow.Enabled = true; }
2. 额外排查项
如果修改后还是有问题,按顺序排查:
- 抓包确认取消关注的请求是否正常发送,请求方法、参数、路径是否符合服务端要求,服务端返回的状态是否为成功。
- 检查
FollowUnFollowUserAsync方法内部逻辑,确认取消关注时第二个参数传false的逻辑和服务端要求一致。 - 确认页面刷新时的用户信息是从服务端拉取的最新状态,没有读取旧的本地缓存。
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

