일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- identifierForVender
- Prism.js
- REST API
- webrtc
- node
- FirebaseAnalytics
- Flutter
- uint16array
- swagger-typescript-api
- androidId
- methodChannel
- web track
- RouteObserver
- Raycasting
- code editor
- Excel
- Completer
- react
- uint8array
- jszip
- Three js
- Babel standalone
- typescript
- babel
- Three-fiber
- Redux
- userevent_tracker
- KakaoMap
- Game js
- Image Resize typescript
- Today
- Total
Never give up
Flutter 2.0 - Null safety에 대한 이해 본문
Null safety는 말 그대로 null값에 대한 안정성을 늘리기 위함입니다
유저가 실수로 체크하지 못한곳에서 발생하는 NullPointerException같은 에러를 조기에 방지하고
실제로 돌아가는 어셈블리상에서 null체크를 다시 안하기 때문에 성능적 이득도 있습니다
간단하게 요약해보자면
nullable : null값이 들어가는것을 허용 (ex: int?, String?, bool?)
non-nullable : null값이 들어가는것을 허용하지 않음 (ex: int, String, bool)
그럼먼저 간단한 매개변수부터 보겠습니다
class ExampleData{
String title;
Widget route;
ExampleData({this.title, this.route});
}
우리에게 익숙했던 이 코드는 더이상 사용할 수 없습니다
대신 required를 사용하거나 null값이 들어갈 수 있다고 표시를 해주거나 default값을 줘야됩니다
//먼저 required를 사용하는 방법으로
class ExampleData{
String title;
Widget route;
ExampleData({required this.title, required this.route});
//@required가 아닌 required입니다
}
//Null값이 들어갈 수 있을 땐 ?를 붙여줍니다
class ExampleData{
String? title;
Widget? route;
ExampleData({this.title, this.route});
}
//초기값 부여
class ExampleData{
String title;
Widget route;
ExampleData({this.title = '', this.route = const Spacer()});
}
기존에 사용하던 @required는 우리가 import하는 material.dart 혹은 coupertino.dart에 있었던 속성이고
앞으로 사용할 required는 언어 수준에서 제공하는 속성입니다
개인적으로 조금 불편하게 바뀐거 같습니다
기존에 @required가 에러를 표시하지 않은건 문제가 되지만
굳이 value를 넣고싶지 않을 때에도 초기값을 정의해줘야되니 말이죠
예를들어 index값을 안넘겨도되는곳이 있고 꼭 넘겨야되는곳이 있는데
기본값을 줘서 처리를 하거나 null값이 들어갈 수 있다고 해놓으면
null체크를 한번 더 해야되니 말이죠
그 다음으로 확인해볼건 기존에 initState에 초기화 했었던 변수들입니다
class _CounterState extends State<Counter> {
int counter;
@override
void initState() {
super.initState();
counter = 0;
}
기존에는 다음과 같이 사용해도 전혀 문제가 없었습니다
하지만 이제부터는 late 속성을 사용하거나 null값이 들어갈 수 있다고 표시해줘야됩니다
//late속성 사용
class _CounterState extends State<Counter> {
late int counter;
@override
void initState() {
super.initState();
counter = 0;
}
//null값 사용
class _CounterState extends State<Counter> {
int? counter;
@override
void initState() {
super.initState();
counter = 0;
}
하지만 ?를 사용하게 되면 --같은 간단한 연산도 null체크를 해줘야됩니다
이런식으로요
counter = counter! - 1;
그래서 initState에서 초기화를 할때는 late를 사용해주는게 좋지 않을까 생각해봅니다
그리고 init에서 초기화를 해주는데 또 체크를 해준다면 낭비인거 같기도 하고요
여기서 !는 if(counter != null)과 동일한거 같은데
if(counter == null){
return;
}
counter = counter - 1;
/*----------------------*/
if(counter != null){
counter = counter - 1;
}
막상 이런식으로 써도 둘 다 빨간줄이 그이더군요
그래서 굳이 null체크를 한다면 변수 뒤에 !를 붙이는게 좋을거 같습니다
이 외에도 다른곳으로 ojbect를 넘길 때 null check를 요구하는 부분이 있는데
안드로이드 스튜디오를 사용하신다면 대부분 IDE에서 필요하다고 알려주니
보면서 차근차근 migration을 하시면 될거 같습니다
Ps. 현재 필자는 migration하다가 예제부터 해본다음에 시작해야겠다는 생각이 들었고,
현재 테스트 겸 이해한 부분을 만들어서 실행해보고 포스트 중입니다 화이팅!
'Flutter' 카테고리의 다른 글
Flutter - ListView inside ListView with shrinkwrap (3) | 2021.03.28 |
---|---|
Flutter 2.0 - ButtonStyle (feat. Deprecated Buttons) (0) | 2021.03.06 |
Flutter - 비동기처리의 이해 (0) | 2021.03.02 |
Flutter - Bloc todo example (0) | 2021.02.28 |
Flutter - How to use exntension with getting widget position (0) | 2021.02.07 |