-
[flutter 2.0] 플러터 2.0을 마이그레이션 하면서 겪게될 에러프로그래밍/Flutter 2021. 6. 13. 15:35
flutter가 대략 3월 즈음에 2.0 버전을 stable로 배포하기 시작했다. 다만 여러 라이브러리들이 아직 null-safety를 지원하지 않아 다른 프로젝트들은 버전업을 못하고 다른 라이브러리들이 null-safety를 지원할때까지 기다려야했을 것이다.
대략 5월 즈음이 되어가면서 대부분의 라이브러리들이 해당부분을 지원하기 시작했고 이제서야 조금 자유롭게 버전업을 할수 있게 되었다.
뭐 어쨌거나 플러터 2.0에서 가장 강조하는 것은 null-safety이다. 실제로 마이그레이션하면서 기존에 사용하던 코드에서 deprecated 된 부분은 버튼 부분들이나 몇몇 골자들밖에 없는데, 가장 큰 문제는 대부분의 변수들에서
Non-nullable 과 nullable 를 구분하지 않고 쓰던 부분이 문제였다.
Sound null safety
Information about Dart's null safety feature
dart.dev
null safety에 대한 부분은 공식 문서가 가장 잘 정리를 하고 있을테니 공식 문서를 참조하는 것이 가장 좋다.
어째든,
가장 먼저 보게 될 부분이 변수 타입에 붙는 ? 일텐데
nullable 변수를 ?로 표시해준다.
기존 플러터에서는
12String title;if(title == null) print('제목없음');cs 이런 식으로 선언만 해주고 초기화를 해주지 않으면 그냥 디폴트값으로 null이 들어갔다.
하지만 플러터 2.0부터는 기본 변수들은 null이 될 수 없도록 했다.
보다시피
The non-nullable local variable
이라는 에러가 뜨면서 아예 컴파일 자체를 막아버린다.
그래서 이렇게 null을 포함시켜주려면 변수타입뒤에 ? 를 붙여주어야 한다.
12String? title;if(title == null) print('제목없음');cs ?가 붙으면 기존에 쓰던 문법처럼 디폴트값이 null이 된다.
그리고 nullable일 경우 선언과 초기화가 다른 곳에서 이루어질 경우에는 null check를 해주어야 한다
같은 곳에서 선언과 초기화가 이루어지면 title가 null이 아니라는것을 확신하기때문에 별 문제가없지만...
이렇게 initState에서 초기화가 이루어지면 title이 null일 가능성이 있다고 판단하고 null check 로 !.를 넣어 주라고 한다.
그래서 이렇게 넣어주면 해당 부분에 오류가 사라진다. 물론 기존에 사용하던데로 ?. 를 이용해서 체크를 할 수도 있다.
그리고 만약 위의 코드에서 initState에서 title의 초기화를 안해준다면?
Null check operator used on a null value
해당 에러를 만나게 될것이다.
그리고 또 특이한 문법이 하나 생겼는데
late 라는 문법이다.
late의 경우 null이 되지는 않지만, 초기값이 존재하지 않는 경우에 사용한다.
말이 좀 이상한데,
1late String title;cs 이렇게 선언해주면 title의 초기값은 null도 아니고 그 무엇도 아닌 값이 된다.
즉 late로 변수를 선언하고 초기화 하지 않고 해당 변수에 접근할 경우
LateInitializationError: Field 'title' has not been initialized.
해당 에러를 만나게 된다.
아까 nullable 변수의 경우는 선언과 초기화의 위치가 다르면 null check 가 필요했는데,
late의 경우는 null이 될 경우가 없기때문에 null check가 필요없게 된다.
그러니까 꼭 null이 필요한 경우가 아니라면 late를 주로 쓰는게 좋다.
추가로 다트에서는 late로 선언된 변수가 초기화 되었는지 안되었는지 확인할 방법이 없다.
코틀린에서는 다트의 late와 비슷한 lateinit이 있고, isInitialized 으로 해당 변수가 초기화 되었는지 안되었는지 확인이 가능하기도 하다.
하지만 다트에서는 지원하지 않는다.
참고링크
How to know whether late init has been initialized in dart(flutter)?
I am fetching data from url in Flutter. I have a late init Map called tables. I am fetching data inside initState() function. When I first launch the app, I am getting LateInizialization error on t...
stackoverflow.com