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
相关产品推荐
相关产品推荐

