본문 바로가기
Mobile APP/Flutter

[Flutter] DropdownButton A value of type 'Object?' can't be assigned to a variable of type 'String'. 오류

by 흐암졸령 2022. 1. 5.
반응형

[문제점]

 플러터에 DropdownButton을 구글검색으로 나온 것과 같이 구현하는데 오류가 발생하였다. 오류가 난 코드는 아래와 같다.

class DropdownEaxampleState extends State<DropdownEaxample> {
  final List<String> _valueList = ['month', 'two weeks', 'week'];
  String _selectedValue = 'week';

  @override
  Widget build(BuildContext context) {
    return DropdownButton(
      value: _selectedValue,
      items: _valueList.map((value) {
        return DropdownMenuItem(
          value: value,
          child: Text(value),
        );
      }).toList(),
      onChanged: (value) {
        setState(() {
          _selectedValue = value;
        });
      },
    );
  }
}

이렇게 코드를 작성하였더니 아래와 같은 오류가 나왔다.

A value of type 'Object?' can't be assigned to a variable of type 'String'.
Try changing the type of the variable, or casting the right-hand type to 'String'.

[해결방법]

 

 오류의 원인은 마지막 onChanged의 value가 Object?의 형식인데 String형식인 _selectedValue에 넣은 것이다. 그러므로 다음의 두가지를 해결해주면 오류는 없어지게 된다.

  1. value가 Object가 아닌 String으로 만들기
  2. value가 null인지 아닌지 체크하기 (null safety)
class DropdownEaxampleState extends State<DropdownEaxample> {
  final List<String> _valueList = ['month', 'two weeks', 'week'];
  String _selectedValue = 'week';

  @override
  Widget build(BuildContext context) {
    return DropdownButton<String>(
      value: _selectedValue,
      items: _valueList.map((value) {
        return DropdownMenuItem(
          value: value,
          child: Text(value),
        );
      }).toList(),
      onChanged: (value) {
        setState(() {
          _selectedValue = value!;
        });
      },
    );
  }
}

1번은 DropdownButton<String>으로 제네릭을 사용해주면 버튼에서 사용할 value의 타입을 string으로 지정해준다. 2번은 onChanged의 value를 value!로 바꾸어서 value의 값이 null이 아님을 알려준다. 만약 value의 값이 null이라면 오류가 나겠지만 우리는 value: _selectedValue로 초기값을 정해주었기 때문에 null이 되지 않는다.

반응형

댓글