You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:54:03