본문 바로가기
개발해보겡/Flutter

Dart NoSuchMethodError & Null Safety & non-nullable 이해하기

by 개발자욱 2022. 12. 31.
728x90
반응형

다음 문서를 참조함

https://dart.dev/null-safety/understanding-null-safety

 

Understanding null safety

A deep dive into Dart language and library changes related to null safety.

dart.dev

 

// Without null safety:
bool isEmpty(String string) => string.length == 0;

main() {
  isEmpty(null);
}

위의 dart 코드를 실행하면 length메서드 호출에서 NoSuchMethodError 예외가 발생합니다.

NoSuchMethodError 는 런타임 시점에 존재하지 않는 메서드를 호출하는 경우에 발생합니다.

isEmpty()에 전달된 null은 length메서드를 호출할 수 없습니다.

( statically-typed languages like Dart에 반하여 ) 컴파일러가 에러를 발생시키지 않기 때문에

서버 응용프로그램과 달리 사용자의 장치에 직접적인 에러를 발생시킬 수 있습니다.

Null Safety는 이러한 실수를 방지하기 위해 만들어졌습니다.

만약 Null Safety를 사용하지 않으려면

pubspec.yaml 에서 sdk 최소 버전을 2.11.0으로 변경합니다. 

environment:
  # Turn off Null Safety (2.11.0)
  sdk: ">=2.12.0 <3.0.0"

Dart 2.11.0 이후 부터

Dart에서 모든 변수는 기본적으로 Non-Nullable입니다.

null은 값의 부재를 가능하게 해주기때문에 아주 유용합니다.

Non-Nullable 변수에서 null을 처리하기 위해서 어떻게 해야할까요?

main() {
	// String 타입 뒤에 '?'를 붙인다.
  String? name = 'name'; 
  name = null; // 정상
  name.length; // 오류
  
  String nickname = 'nickname';
  nickname = null // 오류
  
  if (name != null) {
    name.isNotEmpty;
  }
  // Samething
  name?.isNotEmpty;
  
}

String? 은 Non-Nullable 변수를 Nullable 변수로 변환합니다.

nullable 변수의 오류를 방지하기 위해 if 조건문으로 null을 판별할 수 있지만

위의 코드처럼 다른 표현식을 사용할 수도 있습니다. 

반응형