본문 바로가기
Develop/Flutter

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

by 팅코벨 2021. 8. 4.
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
반응형

댓글