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

如何在用户关闭displayAlert时停止ImageCropper插件的activityIndicator

解决方案

根因分析

你当前的代码存在两个疏漏:

  1. 加载动画activityIndicator的启动时机提前到了弹窗显示之前,用户直接关闭弹窗时,后续裁剪相关逻辑完全不会执行,没有对应分支停止加载
  2. 仅在裁剪成功的Success回调中处理了加载停止逻辑,裁剪取消、裁剪失败的场景也没有做停止处理,同样会出现加载动画一直运行的问题

修复方案

最优方案是调整加载动画的启动时机,仅在用户确认选择弹窗选项后再启动加载,从根源避免未选择场景的加载遗留问题,同时补全所有异常分支的加载停止逻辑,代码示例如下:

// 第一步:先弹出选择弹窗,不提前启动加载
var selectedAction = await DisplayActionSheet("选择图片来源", "取消", null, "上传图片", "拍摄照片");

// 第二步:判断用户是否点击取消/关闭弹窗
if (selectedAction == "取消" || string.IsNullOrEmpty(selectedAction))
{
    // 未选择有效选项,直接返回,无需启动加载
    return;
}

// 第三步:用户确认选择后再启动加载
activityIndicator.IsRunning = true;

// 第四步:补全ImageCropper的所有回调分支
new ImageCropper()
{
    Success = (imageFile) =>
    {
        Device.BeginInvokeOnMainThread(() =>
        {
            // 裁剪成功停止加载
            activityIndicator.IsRunning = false;
            imageView.Source = ImageSource.FromFile(imageFile);
        });
    },
    Cancel = () =>
    {
        Device.BeginInvokeOnMainThread(() =>
        {
            // 用户取消裁剪停止加载
            activityIndicator.IsRunning = false;
        });
    },
    Failure = (errorMsg) =>
    {
        Device.BeginInvokeOnMainThread(() =>
        {
            // 裁剪失败停止加载
            activityIndicator.IsRunning = false;
            // 可选:添加错误提示逻辑
        });
    }
}.Show(this);

如果你的业务逻辑必须要在弹窗显示前就启动加载,只需要在用户关闭弹窗的分支里加一行停止加载的代码即可:

// 特殊业务场景需提前启动加载
activityIndicator.IsRunning = true;

var selectedAction = await DisplayActionSheet("选择图片来源", "取消", null, "上传图片", "拍摄照片");
if (selectedAction == "取消" || string.IsNullOrEmpty(selectedAction))
{
    // 直接停止加载后返回
    activityIndicator.IsRunning = false;
    return;
}

// 后续逻辑同上

注意事项

所有修改activityIndicator.IsRunning属性的UI操作,必须放在Device.BeginInvokeOnMainThread的委托中执行,避免出现跨线程操作UI的异常。

内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 12:45:03