반응형
질문 제목:
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
다음과 같이 말합니다.
형식 승격은 지역 변수에만 적용할 수 있습니다. ... 계산을 실행하고 호출될 때마다 다른 개체를 반환하는 getter에 의해 재정의될 수 있기 때문에 인스턴스 변수의 승격은 적절하지 않습니다. 참조 형식 승격과 유사하지만 동적 검사를 기반으로 하는 메커니즘에 대한 토론과 관련 토론에 대한 일부 링크가 있습니다.
따라서 로컬 유형 프로모션이 작동합니다.
String myMethod(String? myString) {
if (myString == null) {
return '';
}
return myString;
}
그러나 인스턴스 변수는 승격되지 않습니다.
!
이를 위해 연산자 를 사용하여 이 경우 인스턴스 변수가 null이 아님을 Dart에 수동으로 알려야 합니다 .
class MyClass {
String? _myString;
String myMethod() {
if (_myString == null) {
return '';
}
return _myString!;
}
}
반응형
'expert' 카테고리의 다른 글
Flutter(Dart)의 객체 목록을 속성 값으로 정렬 (0) | 2023.01.24 |
---|---|
정의되지 않은 클래스 'FirebaseUser' (0) | 2023.01.24 |
NoSuchMethod 오류란 무엇이며 어떻게 수정합니까? (0) | 2023.01.24 |
Flutter 앱 화면에서 서버의 응답을 표시하는 방법은 무엇입니까? (0) | 2023.01.24 |
Flutter를 사용하여 서버 API의 데이터가 Listview에 표시되지 않습니다. (0) | 2023.01.24 |
댓글