Develop/Flutter

[Flutter ❌] Null-safety 관련 타입 에러

팅코벨 2021. 8. 4. 13:48
728x90

 

아래와 같은 에러가 뜬다면, 타입이 맞지 않아 발생하는것이다.

 

근본적인 해결법은 좌변과 우변의 타입을 일치해주면 되는 그런? 간단한 것.....

 

하지만, Flutter2.0 null-safety도입 후 빈번하게 발생하는 타입 에러⭐ 자주 사용되는 해결법을 먼저 보겠습니다.

 

1. 변수 뒤에  as ~~  붙여주기

ex) enum 타입으로 선언되었을 때

enum Gender { ManWomen }

...

  Gender _gender = Gender.Man;

...

  _gender = value as Gender ;

 

 

2. 변수 뒤에  ! 추가  -강제로 null이 아님(non-null)을 명시

ex) boolean 타입

var _isChecked = false ;   //var은 임시적 타입선언 -변수에 있는 값 판단해서 타입인식

...

  _isChecked = value !  ;

 

3. 인자 앞에 required 입력 - non-null임을 명시

 

 

4. 타입 뒤에  ? 추가 -널을 허용(nullable)

ex) String

 

 

5. 변수 선언시 앞에 late 입력 -사용전 미뤄두기 

 

 


     CODE     

 

Error 발생
import 'package:flutter/material.dart';

class Dropdown extends StatefulWidget {
  @override
  _DropdownState createState() => _DropdownState();
}

class _DropdownState extends State<Dropdown> {
  final _valueList = ['사과', '감자', '오렌지'];
  var _selectedValue = '사과';
  @override
  Widget build(BuildContext context) {
    return Container(
      child: DropdownButton(
        value: _selectedValue,
        items: _valueList.map(
          (value) {
            return DropdownMenuItem(
              value: value,
              child: Text(value),
            );
          },
        ).toList(), 
        onChanged: (value) {
          setState(() {
            _selectedValue = value;
          });
        },
      ),
    );
  }
}

 

Error 해결
  • 아래 주석 설명과 같이, 좌변의 타입이 string인데  앞서 list로 만들어주면서 그 안의 value가 list형(Object가 포함)이 되었다. 그래서 toString으로 우변의 타입도 String으로 만들어줌
import 'package:flutter/material.dart';

class Dropdown extends StatefulWidget {
  @override
  _DropdownState createState() => _DropdownState();
}

class _DropdownState extends State<Dropdown> {
  final _valueList = ['사과', '감자', '오렌지'];
  var _selectedValue = '사과';
  @override
  Widget build(BuildContext context) {
    return Container(
      child: DropdownButton(
        value: _selectedValue,
        items: _valueList.map(
          (value) {
            return DropdownMenuItem(
              value: value,
              child: Text(value),
            );
          },
        ).toList(),   //list로 되면서 value가 Object타입(null-safety적용후)
        onChanged: (value) {
          setState(() {
            _selectedValue = value.toString();   //그래서 좌측 String타입에 맞춰 string으로 변환시켜줌
          });
        },
      ),
    );
  }
}

 

타입 관련되서 정리를 해보면, Flutter2.0부터 바뀐 null-safety에서는

 <null-safety적용 후>
✔ Object 타입: Iterable, num, List, double, int 
✔ String은 String? 로 null허용 가능

 

왼쪽 : Null-safety적용 전 / 오른쪽: Null-safety 적용 후 (null타입이 별도 타입으로)

 

728x90
반응형