Flutter Riverpod突变问题

ubby3x7f  于 2023-05-19  发布在  Flutter
关注(0)|答案(1)|浏览(184)

我正在开发一些棋盘游戏

验证码:

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时,也会更改提供程序的值
我不想更改提供程序的值,仅此而已。
谢谢。

vnzz0bqm

vnzz0bqm1#

我不希望在moveList上所做的更改更改提供程序
它不会触发对提供程序的更改,但是如果您在模型中使用可变类型,则可以更改提供程序内部引用的内容。
在代码中,moveList[i].cord = newCord;更改列表中引用的对象,即提供程序的状态。
简短的回答是,不要那样做。提供程序不会注意到此更改,也不会通知其侦听器,直到下次重新生成提供程序。
您应该避免以这种方式改变提供程序下的状态。为了帮助创建不可变对象,可以考虑使用freezedbuilt_value等包。但一般来说,无论哪种情况,你都必须注意集合。还有其他一些包也可以帮助处理不可变集合。

相关问题