[Dart] Cannot modify unmodifiable map

Ss·2025년 3월 20일

배경

턴제 게임 프로그램을 하는 중, 게임 데이터 저장 불러오기 기능을 만드는 중이었다.
Character 객체를 안에는 아이템과 갯수를 저장하는 변수
Map<Item, int> itemList;
가 있었는데

이 값을 저장, 불러오는 과저에서 Cannot modify unmodifiable map 에러가 났다.

에러 내용 분석

변경 불가능한 값을 바꿀수 없다는 내용의 에러이다.

에러가 뜬 위치는 해당 코드

 List<Item> keys = itemList.keys.toList();

    Item item = keys[index - 1];
    itemList[item] = itemList[item]! - 1; // 에러
    if (itemList[item] == 0) {
      itemList.remove(item);
    }
  • map형식의 itemList를 list로 바꾸고
  • 0번은 뒤로가기 값이라 index 1번부터 유효한 값이다.
    때문에 입력받은 index에서 1을 빼주고 그 위치의 Item을 임시로 갖고 있는다.
  • map인 itemList에서 선택한 Item의 value를 -1 해준다.

이때 itemList의 value 값을 바꿀 수 없나보다.

원인

아이템 리스트를 처음 초기화 해줄때 const로 해주고 있었다.


    this.itemList = const {Item.hp: 1, Item.attack: 1, Item.defense: 1},

당연히 const에 값을 수정하려 했으니 오류뜨는건 당연했다.

해결

const로 선언된 값을 수정를 못하는거지 itemList의 값을 바꾸는건 문제가 없기때문에
Map.from 를 이용해 map을 새로 생성해 넣어준다.

    itemList = Map<Item, int>.from(itemList);

예시코드

void main() {
  Map map = const {'one': 1, 'two': 2, 'three': 3};
  
// 에러
// map['one'] = 1; 

  map = Map.from(map);
  map['one'] = 1; 
}

0개의 댓글