본문 바로가기
expert

Dart null-safety로 마이그레이션한 후 "수신자가 null일 수 있기 때문에 연산자를 무조건적으로 호출할 수 없습니다" 오류

by RWriter 2023. 1. 24.
반응형

질문 제목:

Dart null-safety로 마이그레이션한 후 "수신자가 null일 수 있기 때문에 연산자를 무조건적으로 호출할 수 없습니다" 오류

질문 내용:

Flutter 프레임워크를 기반으로 하는 개인 패키지를 업그레이드하고 있습니다.

여기

Flutter Text 위젯 소스 코드에서 null 검사가 있음을 확인했습니다 .

if (textSpan != null) {
  properties.add(textSpan!.toDiagnosticsNode(name: 'textSpan', style: DiagnosticsTreeStyle.transition));
}

그러나

textSpan!

여전히

!

연산자를 사용하고 있습니다. 연산자

textSpan

를 사용하지 않고 null을 허용하지 않는 형식으로 승격하면 안 됩니까 ?

!

그러나 연산자를 제거하려고 하면 다음 오류가 발생합니다.

An expression whose value can be 'null' must be null-checked before it can be dereferenced.
Try checking that the value isn't 'null' before dereferencing it.

다음은 독립적인 예입니다.

class MyClass {
  String? _myString;
  
  String get myString {
    if (_myString == null) {
      return '';
    }
    
    return _myString; //   <-- error here
  }
}

컴파일 타임 오류가 발생합니다.

오류: 'String?' 유형의 값 반환 유형이 'String'이므로 함수 'myString'에서 반환할 수 없습니다.

또는 가져오려고

_mySting.length

하면 다음 오류가 발생합니다.

수신자가 'null'일 수 있으므로 속성 '길이'는 무조건 액세스할 수 없습니다.

 

_myString

null 검사를 수행하면 null 을 허용하지 않는 유형으로 승격될 것이라고 생각 했습니다. 왜 그렇지 않습니까?

내 질문

은 GitHub에서 해결되었으므로 아래에 답변을 게시하고 있습니다.

해결 답변:

Dart 엔지니어 Erik Ernst

는 GitHub에서

다음과 같이 말합니다.

형식 승격은 지역 변수에만 적용할 수 있습니다. ... 계산을 실행하고 호출될 때마다 다른 개체를 반환하는 getter에 의해 재정의될 수 있기 때문에 인스턴스 변수의 승격은 적절하지 않습니다. 참조

dart-lang/language#1188

형식 승격과 유사하지만 동적 검사를 기반으로 하는 메커니즘에 대한 토론과 관련 토론에 대한 일부 링크가 있습니다.

따라서 로컬 유형 프로모션이 작동합니다.

  String myMethod(String? myString) {
    if (myString == null) {
      return '';
    }
    
    return myString;
  }

그러나 인스턴스 변수는 승격되지 않습니다.

!

이를 위해 연산자 를 사용하여 이 경우 인스턴스 변수가 null이 아님을 Dart에 수동으로 알려야 합니다 .

class MyClass {
  String? _myString;
  
  String myMethod() {
    if (_myString == null) {
      return '';
    }
    
    return _myString!;
  }
}
반응형

댓글