如何为Dart中Playcard对象列表添加自增id属性?
解决Dart中为Playcard列表添加自增id的问题
问题原因
- Dart的顶级作用域仅允许变量/函数声明,不能直接执行循环赋值这类执行语句,所以把循环放在方法外会报错。
- 你定义的
addId是顶级函数,必须在程序入口main函数中调用才会执行,否则不会自动触发。
解决方案
方案一:通过main函数调用addId方法
在代码中添加main函数,调用addId来执行id赋值逻辑:
import 'package:memory/models/playcard.dart'; var availablePlaycards = [ Playcard(front: 'back.png', back: 'sheep.png', flipped: false), Playcard(front: 'back.png', back: 'cow.png', flipped: false), Playcard(front: 'back.png', back: 'pig.png', flipped: false), ]; final List<Playcard> clonedCards = [...availablePlaycards]; var doubledCards = List<Playcard>.from(availablePlaycards)..addAll(clonedCards)..shuffle(); void addId() { for (int i = 0; i < doubledCards.length; i++) { doubledCards[i].id = i + 1; // 若需从1开始自增则+1,从0开始直接用i } print(doubledCards); } // 程序入口,调用addId执行赋值 void main() { addId(); }
方案二:链式调用直接初始化时赋值id
利用asMap()将列表转为索引-元素映射,通过forEach直接在列表初始化链中完成id赋值,更简洁:
import 'package:memory/models/playcard.dart'; var availablePlaycards = [ Playcard(front: 'back.png', back: 'sheep.png', flipped: false), Playcard(front: 'back.png', back: 'cow.png', flipped: false), Playcard(front: 'back.png', back: 'pig.png', flipped: false), ]; final List<Playcard> clonedCards = [...availablePlaycards]; var doubledCards = List<Playcard>.from(availablePlaycards) ..addAll(clonedCards) ..shuffle() ..asMap().forEach((index, card) { card.id = index + 1; // 自增id,按需选择从0或1开始 }); void main() { print(doubledCards); // 验证结果 }
补充说明
你的Playcard类中id属性未用final修饰,是可修改的,这部分定义没问题,能正常接受赋值。
内容的提问来源于stack exchange,提问作者Gunnar Polte
相关产品推荐
相关产品推荐

