티스토리 뷰

반응형

DropdownButtonFormField를 사용하던 중, 다음과 같은 에러가 발생했다.

There should be exactly one item with [DropdownButton]'s value: Instance of 'LogCategory'. 
Either zero or 2 or more [DropdownMenuItem]s were detected with the same value
'package:flutter/src/material/dropdown.dart':
Failed assertion: line 1604 pos 15: 'items == null || items.isEmpty || value == null ||
              items.where((DropdownMenuItem<T> item) {
                return item.value == value;
              }).length == 1'

 

이 에러를 이해하기 위해서 알아야 할 DropDownButton의 속성은 다음과 같다.

value : 드롭 다운 아이템의 초기값

items : 드롭 다운으로 만들어질 아이템들

 

에러 문구에는 이 에러가 발생하는 이유는 다음과 같다고 한다.

1. items가 null인 경우

2. tems기 비어 있는 경우

3. value가 null인 경우

 

하지만 이 문구의 경우 외에도 다른 원인으로도 동일한 에러가 발생할 수 있다.

4. items에 중복된 아이템이 있는 경우

5. value가 items에 없는 경우

 

그러므로 위의 5가지의 경우에 해당하는 것이 아닌지 확인해 보자.

 

 

만일 사용자 정의 클래스를 value로 사용한다면 ==연산자와 hashCode를 정의해보자. 이렇게 하면 참조가 아닌 값으로 비교가 가능해 진다.

class LogCategory {
  final int id;
  final String name;
  final int color;

  LogCategory({required this.id, required this.name, required this.color});

  @override
  bool operator ==(Object other) {
    if (identical(this, other)) return true;

    return other is LogCategory &&
        other.id == id && // id로 비교
        other.name == name; // 필요시 name으로도 비교 가능
  }

  @override
  int get hashCode => id.hashCode ^ name.hashCode;
}
반응형
댓글
공지사항