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