我正在开发一些棋盘游戏
验证码:
static List<Ball> calculateAllMoveCordsForHardMove(int wichBoard) {
final List<Ball> moveList =
navigatorKey.currentContext!.read(gameStatusProvider).moves;
print(
'Cord(${moveList[0].cord?.x.toString()}, ${moveList[0].cord?.y.toString()})');
for (int i = 0; i < moveList.length; i++) {
final boardNumber = moveList[i].wichBoard ?? 0;
if (boardNumber == wichBoard) {
final cord = moveList[i].cord ?? Cord(0, 0);
final newCord = nextCord(cord, boardNumber);//just returuns a cord
moveList[i].cord = newCord;
}
}
final moves2 =
navigatorKey.currentContext!.read(gameStatusProvider).moves;
print(
'Cord(${moves2[0].cord?.x.toString()}, ${moves2[0].cord?.y.toString()})');
return moves;
}
输出:
flutter: Cord(0, 2)
flutter: Cord(0, 0)
read返回一个可变引用
当我更改moveList时,也会更改提供程序的值
我不想更改提供程序的值,仅此而已。
谢谢。
1条答案
按热度按时间vnzz0bqm1#
我不希望在moveList上所做的更改更改提供程序
它不会触发对提供程序的更改,但是如果您在模型中使用可变类型,则可以更改提供程序内部引用的内容。
在代码中,
moveList[i].cord = newCord;
更改列表中引用的对象,即提供程序的状态。简短的回答是,不要那样做。提供程序不会注意到此更改,也不会通知其侦听器,直到下次重新生成提供程序。
您应该避免以这种方式改变提供程序下的状态。为了帮助创建不可变对象,可以考虑使用freezed、built_value等包。但一般来说,无论哪种情况,你都必须注意集合。还有其他一些包也可以帮助处理不可变集合。