如何在用户关闭displayAlert时停止ImageCropper插件的activityIndicator
解决方案
根因分析
你当前的代码存在两个疏漏:
- 加载动画
activityIndicator的启动时机提前到了弹窗显示之前,用户直接关闭弹窗时,后续裁剪相关逻辑完全不会执行,没有对应分支停止加载 - 仅在裁剪成功的
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
相关产品推荐
相关产品推荐

