void main()
{
// 1. 에러 : Dart 2.12이상 부터 기본적으로 null을 허용하지 않는다.
//String _name1;
//print(_name1); // error
// 2. 정상
String _name2;
_name2 = "Aiden";
print(_name2); // Aiden
// 3. 정상 : 변수Type에 ?을 붙이면 Nullable변수로 선언한다. 만약 _name4 = _name3; 로직 다음 name4이 null이 아니라는 가정의 로직이 있다면 error 발생한다.
String? _name3;
print(_name3); // null
// 4. 정상 : Nullable변수라도 초기화를 했다면 Non-Nullable변수에 할당할 수 있다.
String? _name4 = "Aiden";
String _name5 = _name4;
print(_name5); // Aiden
// 5. 에러 : 배열의 요소조차 null을 허용하지 않는다.
//List<String> _list = ["one", null, "three"];
// 6. 정상
List<String?> _list = ["one", null, "three"];
// 7. 에러 : 첫번재 요소가 null이 아니지만 Nullable가능성이 있다면 Non-Nullable번수에 할당할 수 없다.
//String _first = _list.first;
// 8. 정상 : Nullable변수에 !를 붙이면 절대 Null이 아니라는 지시자로써 compile시 exception을 발생시키지 않는다.
String _first = _list.first!;
print(_first); // one
}
void main() {
// null, exception발생 안함
print(stringLength(null));
// 4
print(stringLength("TEST"));
}
int? stringLength(String? nullableString) {
return nullableString?.length;
}
??
// If user.age is null, defaults to 18
this.userAge = user.age ?? 18;
??=
int? x;
x ??= 3; // if x is null, assigned 3
@required 는 required 로 변경
수정전
class SecondPage extends StatefulWidget {
final List<Animal>? list;
const SecondPage({super.key, @required this.list});
@override
State<StatefulWidget> createState() => _SecondPage();
}
수정후
class SecondPage extends StatefulWidget {
final List<Animal> list;
const SecondPage({super.key, required this.list});
@override
State<StatefulWidget> createState() => _SecondPage();
}
초기화 되지 않은 내부변수에 ? 필요없이, 생성자 파라메터에 required keyword로 지정하면 된다. @required는 이제 필요없다.
기존에 사용하던 @required는 material.dart 혹은 coupertino.dart에 정의된 속성으로 runtime에 null체크를 하고,
대체된 required는 언어 수준에서 제공되는 속성으로 compile time에 null체크를 한다.
참조 :
https://dart.dev/codelabs/null-safety
https://flutterbyexample.com/lesson/null-aware-operators