如何在Flutter MVC设计模式中实现牌组数量联动卡牌计数功能
解决方案
核心逻辑修正思路:你之前的问题本质是没有拆分清楚「单副牌面值基数」、「牌组数量」、「已消耗张数」三个维度的关系,调整方案如下:
1. Model层修改
我们把单副牌每张面值的初始数量固定为常量,新增变量存储对应面值已消耗的张数,总剩余张数通过公式实时计算,同时处理牌组数量调整后的边界问题。
// 单副牌对应面值的初始数量,固定常量 static const int _baseFaceCardCount = 4; // 已消耗的2号牌数量 static int _consumedFaceCard2 = 0; static int _deckCount = 1; // 实时计算当前2号牌的剩余总数量 static int get faceCard2 { final total = _baseFaceCardCount * _deckCount - _consumedFaceCard2; return total > 0 ? total : 0; } // 点击面值按钮递减逻辑 static int decrementFaceCard2() { if (faceCard2 > 0) { _consumedFaceCard2++; } return faceCard2; } // 牌组数量调整逻辑,新增边界处理:如果调小牌组后已消耗数量超过总基数,自动修正已消耗值 static int get deckCount => _deckCount; static int incrementDeckCount() => _deckCount++; static int decrementDeckCount() { if (_deckCount > 1) { _deckCount--; // 边界处理:避免调小牌组后剩余数量为负 final maxTotal = _baseFaceCardCount * _deckCount; if (_consumedFaceCard2 > maxTotal) { _consumedFaceCard2 = maxTotal; } } return _deckCount; }
2. Controller层修改
不需要改动原有逻辑,原有调用方法完全兼容,因为Model层对外暴露的getter和方法名没有变化。
3. View层修改
不需要改动原有逻辑,直接读取ManualCountController.faceCard2即可同时响应面值按钮点击、牌组数量调整两种场景的数值变化。
逻辑验证
- 牌组数量设为2:初始总数量=4*2=8,点击面值按钮1次,已消耗=1,剩余=7,符合减1的需求
- 牌组数量调整为3:总数量自动变为4*3=12,已消耗还是1,剩余=11,符合联动更新需求
- 牌组数量从2调整为1时,如果之前已经消耗了5张,会自动把已消耗修正为4,剩余=0,不会出现负数
内容的提问来源于stack exchange,提问作者Ants
相关产品推荐
相关产品推荐

