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

Dart中Switch多Case语句报错:The 'case' shouldn't complete normally

问题解决:Dart Switch语句报错"The 'case' shouldn't complete normally"

错误原因

问题出在case PurchaseStatus.error分支——这个分支末尾没有添加break语句,导致代码执行完该case后会继续流入下一个case PurchaseStatus.canceled分支,违反了Dart的switch语法规则:每个case分支必须明确终止(通过break、return、continue等),不能"正常结束"后自动往下执行。

你用到的多case合并写法(case PurchaseStatus.restored:与case PurchaseStatus.purchased:共用逻辑)完全符合Dart规范,没有问题。

修复后的代码

switch (purchaseDetails.status) {
  case PurchaseStatus.pending:
    _adRemoval = const AdRemovalPurchase.pending();
    notifyListeners();
    break;
  case PurchaseStatus.restored:
  case PurchaseStatus.purchased:
    bool valid = await _verifyPurchase(purchaseDetails);
    if (valid) {
      _adRemoval = const AdRemovalPurchase.active();
      if (purchaseDetails.status == PurchaseStatus.purchased) {
        showSnackBar('Thank you for your support!');
      }
      notifyListeners();
    } else {
      _log.severe('Purchase verification failed: $purchaseDetails');
      _adRemoval = AdRemovalPurchase.error(
          StateError('Purchase could not be verified'));
      notifyListeners();
    }
    break;
  case PurchaseStatus.error:
    _log.severe('Error with purchase: ${purchaseDetails.error}');
    _adRemoval = AdRemovalPurchase.error(purchaseDetails.error!);
    notifyListeners();
    break; // 添加break终止当前分支
  case PurchaseStatus.canceled:
    _adRemoval = const AdRemovalPurchase.notStarted();
    notifyListeners();
    break; // 建议添加,保持代码一致性
}

补充说明

  • Dart的switch是穷尽式设计,同时强制每个分支必须显式终止,避免意外的代码贯穿行为(不同于部分语言默认允许贯穿)。
  • 即使是最后一个case分支,也建议添加break,后续扩展case时能减少出错概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:22:43