호환성이 깨지는 변경 및 폐기
호환성이 깨지는 변경 및 폐기
다트의 릴리스별 호환성이 깨지는 변경 목록이에요.
본문
⚠️ 이 페이지는 폐기(deprecated)됐어요. 언어와 SDK의 변경 사항은 Changelog, 버전 관리가 다트와 SDK에서 어떻게 쓰이는지는 Language versioning을 참조해 주세요.
이 페이지는 다트 SDK 업데이트의 모든 호환성 파괴 변경과 폐기 사항을 릴리스와 영역별로 정리해서, 다트 개발자가 그 영향을 이해하고 관리하는 데 도움을 주기 위한 것이에요. 완전한 릴리스 노트는 Dart SDK changelog에서 볼 수 있어요. 호환성 파괴 변경 정책 문서는 다트의 호환성 파괴 변경과 폐기 주변의 정책과 과정을 설명해요.
이 페이지는 다음 유형의 호환성 파괴 변경을 포함해요.
- 버전 미지정(Unversioned): 다트 SDK는 하위 호환성을 유지하지 않아서, 코드가 이전 동작에 의존한다면 sdk 버전을 업그레이드하는 즉시 깨질 수 있어요. 이것들은 변경의 대부분을 차지하며 이 목록에서 특별히 표시되지 않아요.
- 언어 버전 지정(Language versioned): 다트 SDK는 기존 코드에 대한 하위 호환성을 유지하고, 동작 변경은 코드의 언어 버전을 업그레이드할 때만(이전 동작에 의존하는 코드를 잠재적으로 깨뜨리며) 발효돼요. 이것들은 Language versioned로 표시돼요.
- 폐기(Deprecations): 다트 SDK는 경고와 함께 폐기된 코드에 대한 호환성을 유지해요. 폐기 사항은 이후 릴리스에서 완전히 제거되어, 이전 동작에 의존하는 코드를 깨뜨려요. 이것들은 Deprecated / Removed로 표시돼요.
- 실험적(Experimental): 릴리스의 일부지만 SDK에서 아직 안정적인 것으로 취급되지 않아 버전마다 깨질 수 있어요. 실험적 변경은 항상 대응하는 호환성 파괴 변경 이슈가 있는 것은 아니지만, SDK changelog에 더 자세한 내용이 있을 수 있어요. 이것들은 Experimental로 표시돼요.
이 호환성 파괴 변경 중 어떤 것에 대해 질문이나 우려가 있다면, 관련 항목에서 연결된 호환성 파괴 변경 이슈에 댓글을 남겨 주세요. 향후 호환성 파괴 변경에 대한 알림을 받으려면 Dart announce 그룹에 가입해요.
3.13.0
언어
- Language versioned — 더 이상 비선언 매개변수(non-declaring parameters)에
final이나var를 사용할 수 없어요. 다트는 이제 둘 다 primary 생성자에서 매개변수를 선언하는 용도로 예약해요. 영향받는 매개변수 선언에서final이나var를 제거해요. 매개변수 재할당을 여전히 막고 싶다면parameter_assignments린트 규칙을 쓸 수 있어요. - 내부 제너레이터 함수에서의 타입 승격이 조정됐어요.
라이브러리
dart:io
NetworkInterface.addresses가 이제List<InternetAddress>대신List<InterfaceAddress>를 반환해요.InternetAddress의 새InterfaceAddress서브타입은prefixLength필드와broadcast게터를 노출해요.NetworkInterface를 구현하고addresses를 재정의하는 코드는 반환 타입을 업데이트해야 해요.InternetAddress.lookup이 더 이상inet_aton이 전통적으로 받아들이는 잘못된 IPv4 주소를 받아들이지 않아요.
dart:js_interop
JSFunction과JSExportedDartFunction이 이제 제네릭이에요.JSExportedDartFunction<T>.toDart는 이제 원래 래핑된 함수를 타입 인자T로 캐스팅하고,isA<JSExportedDartFunction<T>>는 이제 래핑된 함수가T인지도 확인해요.JSFunction과JSExportedDartFunction의 런타임 타입은 변하지 않아요.
도구
분석기(Analyzer)
- Deprecated —
avoid_private_typedef_functions린트 규칙이 폐기되고analysis_options.yaml파일에서 제거해야 해요. - Deprecated —
one_member_abstracts린트 규칙이 폐기되고analysis_options.yaml파일에서 제거해야 해요.
포매터(dart format)
- 컴파일 단위나 중괄호 본문의 끝에 있는 주석 앞의 빈 줄을 추가하지 않게 됐어요.
- 확장 타입 표현 절(representation clauses)이 이제 primary 생성자 형식 매개변수 목록과 같은 방식으로 포매팅돼요.
- 후행 쉼표가 보존될 때, 멤버가 있는 enum에서 후행 쉼표가 없으면
;앞에 새 줄을 넣지 않게 됐어요. - 일부 컬렉션이나 인자가 불필요하게 분할될 수 있던 버그를 수정했어요.
- Language versioned — 매개변수 목록을 이제 블록 포매팅할 수 있어요.
- Language versioned —
as,is,is!표현식을 이제 블록 포매팅할 수 있어요. - Language versioned —
;본문이 없는 mixin과 확장 타입 선언 주변에 빈 줄이 추가돼요. - Language versioned — 임포트가 이제 섹션으로 분리돼요.
- Language versioned — 분할된 확장 타입 표현 절에 후행 쉼표가 이제 추가돼요.
런타임
- Removed — 시스템 인증서를 찾을 수 없을 때 사용되던 내장 폴백 루트 인증서가 더 이상 포함되지 않아요. 시스템 인증서를 찾을 수 없다면,
--root-certs-file이나--root-certs-cache옵션을 사용해 독립 실행형 Dart VM에 폴백 인증서를 제공해요.
임베더 API(Embedder API)
runtime/include/dart_tools_api.h의Dart_FileModifiedCallback이 이제 epoch 이후 초(seconds) 대신 밀리초(seconds)가 아니라 마이크로초(microseconds)를 정수로 전달해요.
3.12.0
라이브러리
dart:js_interop
isA확장 메서드가 어떤Object?의 타입 검사를 지원하도록JSAnyUtilityExtension에서NullableObjectUtilExtension으로 이동했어요. 이 변경은 확장을 직접 적용하거나show/hide지시문을 통해 확장 이름을 직접 참조한 경우에만 깨져요.isA<JSObject>()가 이제 프로토타입이 없는 JS 객체를 올바르게 처리하고,isA<JSAny>()는 값이 JS 값인지에 대한 사소하지 않은 검사를 해요.isA<JSExportedDartFunction>()이 이제 함수가 실제로Function.toJS또는Function.toJSCaptureThis에서 반환된 JS 래퍼 함수인지 검사해요.
도구
Pub
dart pub cache repair가 이제 기본적으로 현재 프로젝트의pubspec.lock파일이 참조하는 패키지만 복구해요. 이전 릴리스처럼 pub 캐시의 모든 패키지를 복구하려면 새--all플래그를 전달해요.
Wasm 컴파일러(dart2wasm)
- 지연 로딩 모듈 로더 API가 지연 모듈의 배치 가져오기(batched fetching)를 허용하도록 업데이트됐어요. 임베더가 이제 개별 모듈 이름 대신 모듈 이름 배열을 기대해야 하는
loadDeferredModule대신loadDeferredModules를 받아요. 모든 모듈 로딩 함수는 이제 로딩된 결과물을 전달해야 하는instantiator콜백도 받아들여야 해요.
프로덕션 JavaScript 컴파일러(dart2js)
JSExportedDartFunction.toDart가 이제 DDC와 dart2wasm과 일관되도록, 래퍼 JS 함수가Function.toJS또는Function.toJSCaptureThis의 결과가 아니면 던져요. 이전에는 폐기된allowInterop함수 호출에서 캐스팅된 래퍼 JS 함수라도 때때로 원래 Dart 함수를 잘못 반환했어요.
3.11.0
도구
분석기(Analyzer)
- Deprecated —
avoid_null_checks_in_equality_operators린트 규칙이 폐기되고analysis_options.yaml파일에서 제거해야 해요. - Deprecated —
prefer_final_parameters린트 규칙이 폐기되고analysis_options.yaml파일에서 제거해야 해요. - Deprecated —
use_if_null_to_convert_nulls_to_bools린트 규칙이 폐기되고analysis_options.yaml파일에서 제거해야 해요.
Wasm 컴파일(dart compile wasm)
- Removed —
dart:js_util또는package:js를 임포트하는 코드는 이제 WebAssembly로 컴파일할 때 컴파일 오류가 돼요. 이 라이브러리의 어떤 API를 호출해도 런타임 오류가 돼요. 사용처는dart:js_interop과dart:js_interop_unsafe로 마이그레이션해야 해요.
3.10.0
언어
- 반환 타입을 지정하지 않은
sync*와async*제너레이터 함수는 이제 null 값이 생성되지 않을 때 반환 타입을 올바르게 널 불가로 추론해요. 이것은 불필요한 널 인지 접근 연산자(?.) 같은 불필요한 코드 요소와 관련된 새 진단을 촉발할 수 있어요.
라이브러리
dart:core
Uri.parseIPv4Address와Uri.parseIPv6Address함수가 더 이상 IPv4 주소의 앞자리 0을 잘못 허용하지 않아요.- Deprecated —
RegExp와RegExpMatch를 구현하는 능력이 폐기되고 향후 릴리스에서 제거될 예정이에요.
dart:io
IOOverrides를 더 이상 구현할 수 없지만 여전히 확장할 수 있어요.
dart:js_interop
Uint16ListToJSInt16Array확장이Uint16ListToJSUint16Array로 이름이 바뀌었어요.JSUint16ArrayToInt16List확장이JSUint16ArrayToUint16List로 이름이 바뀌었어요.Function.toJSCaptureThis함수가 이제Function.toJS와 일치하는 추가 컴파일 타임 검사를 일으켜요. 함수가 정적으로 알려진 타입이 없거나, 시그니처에 지원되지 않는 타입이 있거나, 타입 매개변수를 포함하거나, 명명 매개변수가 있으면 호출이 컴파일 타임 오류가 돼요.
도구
SDK
dartCLI와 Dart VM이 이제 별도의 실행 파일이 됐고, 순수 Dart VM 실행 파일과 프로세스를dartvm이라고 불러요. Dart 프로그램은 여전히dart run으로 실행해야 해요.dart format,dart compile같은dart도구의 하위 명령이 이제 기본 도구의 AOT 컴파일 스냅샷을 실행해요. 성능 개선 외의 기능적 차이는 없어야 하지만, 비호환성을 발견하면 보고해 주세요.- Removed — 다트 SDK가 더 이상 IA32를 지원하지 않으므로
dart도구를 IA32 플랫폼에서 사용할 수 없게 됐어요.
분석기(Analyzer)
@experimental로 표시된 멤버를 선언된 패키지 밖에서 사용하면 이제 경고가 돼요.- 포함된 analysis options 파일에서 활성화된 린트 규칙이 이제 적절할 때 호환되지 않는 린트 진단을 일으켜요.
- Removed —
package:meta의 폐기된@required애너테이션을 더 이상 지원하지 않아요. 매개변수를 필수로 표시하려면 대신required키워드를 사용해요.
Wasm 컴파일(dart compile wasm)
dart:js_util과package:js가 WebAssembly로 컴파일할 때 더 이상 지원되지 않아요. 이 라이브러리의 어떤 API를 호출해도 런타임 오류가 돼요. 사용처는dart:js_interop과dart:js_interop_unsafe로 마이그레이션해야 해요.- JS 컴파일러와 일치시키기 위해,
dartify는 이제 Wasm으로 컴파일할 때 JSPromise객체를 DartJSValue객체 대신 DartFuture객체로 변환해요.
3.9.0
언어
- Language versioned — 타입 승격, 도달 가능성, 확실한 할당을 계산할 때 이제 널 세이프티가 가정돼요. 결과적으로 개선된 데드 코드 분석이 이전에 분석을 통과했던 기존 코드에서 새 분석기 진단을 촉발할 수 있어요.
도구
dart analyze,dart fix같은dart도구의 일부 하위 명령이 이제 기본 도구의 AOT 컴파일 스냅샷을 실행해요. 성능 개선 외의 기능적 차이는 없어야 하지만, 비호환성을 발견하면 보고해 주세요.
Pub
- Language versioned — 워크스페이스 루트 패키지의
flutterSDK 제약의 상한이 이제 존중돼요. 현재 SDK가 지정된 상한을 충족하지 않으면dart pub get과 의존성을 가져오는 다른 작업이 실패해요.
Dart build
- Experimental — 실험적 네이티브 애셋 지원으로 CLI 앱 번들을 빌드하려면 이제
dart build cli하위 명령을 사용하고 새--target옵션으로 앱 진입점을 지정해야 해요.
3.8.0
라이브러리
dart:html
- Removed —
Element.created생성자가 제거됐어요. dart:html의 네이티브 클래스(예:HtmlElement)를 더 이상 확장할 수 없어요.
도구
분석기(Analyzer)
- Deprecated —
avoid_null_checks_in_equality_operators린트 규칙이 폐기되고analysis_options.yaml파일에서 제거해야 해요.
개발 JavaScript 컴파일러(DDC)
- 리다이렉팅 팩토리 생성자가 tear-off 되고 그 선택적 널 불가 매개변수 중 하나에 값이 제공되지 않으면 이제 런타임 오류를 던져요. 향후에는 컴파일 타임 오류가 될 가능성이 높아요.
프로덕션 JavaScript 컴파일러(dart2js)
- Experimental Removed —
--experiment-new-rti와--use-old-rti플래그를 더 이상 지원하지 않아요.
포매터(dart format)
- Language versioned — 포매터가 언어 버전 3.8 이상으로 코드를 포매팅할 때 새 출력을 만들어 내는 변경과 수정을 했어요.
3.7.0
언어
- Language versioned —
_로 이름 지어진 지역 변수와 매개변수가 이제 비바인딩(non-binding)이라 더 이상 사용하거나 접근할 수 없어요. - 도달 가능성 분석이 이제 필드가
is나as를 사용해Null로 타입 승격됐는지도 고려해요. 이것은 승격된 지역 변수의 동작을 반영하므로 타입 시스템을 더 자체적으로 일관되게 만들어요. 이 변경이 실제로 차이를 만들 것으로 기대되지는 않아요.
라이브러리
dart:html, dart:indexed_db, dart:svg, dart:web_audio, dart:web_gl, dart:js
- Deprecated — 이 레거시 웹 라이브러리들이 공식적으로 폐기됐어요. 향후 릴리스에서 제거될 것으로 예상돼요. 프로젝트는
package:web과dart:js_interop을 사용하도록 마이그레이션해야 해요. 자세한 내용은 Migrate to package:web를 확인해요.
dart:js, dart:js_util, package:js
- Deprecated — 이 레거시 JS-interop 라이브러리들이 공식적으로 폐기됐어요. 향후 릴리스에서 제거될 것으로 예상돼요. 프로젝트는
dart:js_interop을 사용하도록 마이그레이션해야 해요. 자세한 내용은 JS interop usage를 확인해요.
도구
분석기(Analyzer)
- Removed —
package_api_docs와unsafe_html린트 규칙이 제거됐고analysis_options.yaml파일에서 제거해야 해요.
포매터(dart format)
- Language versioned — 포매터가 언어 버전 3.7 이상으로 코드를 포매팅할 때 새 출력을 만들어 내는 새 스타일을 구현해요.
- Removed —
dart format의--fix플래그를 더 이상 지원하지 않아요. 비슷한 수정과 그 이상을 적용하려면 analysis options를 구성하고dart fix를 실행해요. - Deprecated —
dart format의--line-length옵션이 폐기되고 제거 예정이에요. 모든 사용처는 새--page-width옵션으로 마이그레이션해야 해요.
3.6.0
언어
throw표현식의 피연산자에 대해 다트가 타입 추론을 수행하는 데 사용하는 컨텍스트가 "알 수 없는 타입"에서Object로 변경됐어요. 이것은 null을 던지는 것이 합법적이지 않다는 사실을 반영하므로 타입 시스템을 더 자체적으로 일관되게 만들어요. 이 변경이 실제로 차이를 만들 것으로 기대되지는 않아요.
라이브러리
dart:io
- Removed —
Platform()생성자가 제거됐어요.Platform의 모든 인스턴스화를 제거해야 해요. HttpClient가 "Location" 헤더가 없는 리다이렉트에 응답할 때 이제StateError대신RedirectException을 던져요.
도구
분석기(Analyzer)
- Deprecated —
package_api_docs와unsafe_html린트 규칙이 폐기되고 다트 3.7에서 제거될 예정이에요.
컴파일러 프론트엔드(cfe)
- 다트 컴파일러가 이제 서브타입 테스트 절차에 전달되기 직전에 타입 스키마의 상한과 하한 폐포(closures)를 계산해요. 다트 3.6 이전에는 컴파일러가 상한·하한 계산의 맨 처음에 계산했어요. 분석기는 이미 이 동작을 따르므로 이미 분석을 통과한 앱은 이 변경의 영향을 받을 가능성이 낮아요.
Wasm 컴파일러(dart2wasm)
- WebAssembly로 컴파일할 때 조건부 임포트에서
dart.library.js조건이 이제 false예요. 대신dart.library.js_interop조건을 사용해야 해요.
포매터(dart format)
다음 변경은 다트 3.6 SDK 이상으로 dart format을 실행할 때 약간의 포매팅 변경을 초래할 수 있어요.
this.나super.도 사용하는 구식(function-typed) 형식 매개변수에서 타입 매개변수를 보존해요.as와if절이 모두 있는 임포트를 올바르게 포매팅해요.
Pub
dart pub publish가 이제 git으로 추적되는 파일에 커밋되지 않은 변경이 있으면 경고해요.
3.5.0
언어
- 컴파일러가
await표현식의 피연산자에 대해 타입 추론을 수행하는 데 사용하는 컨텍스트가 분석기의 동작과 일치하도록 변경됐어요. - 컴파일러가 "if-null" 표현식(
e1 ?? e2)의 오른쪽에 대해 타입 추론을 수행하는 데 사용하는 컨텍스트가 분석기의 동작과 일치하도록 변경됐어요. 명시적 타입을 제공하면 이전 동작을 복원할 수 있어요.
라이브러리
dart:core
DateTime이 이제 웹 플랫폼에서 마이크로초를 저장해서, 네이티브 플랫폼의 동작에 더 가깝게 맞춰요.
dart:io
SecurityContext가 이제final이라 더 이상 서브클래싱할 수 없어요.
dart:js_interop
importModule이 이제String대신JSAny를 받아TrustedScriptURL객체 같은 다른 JS 값도 지원해요.isTruthy와not이 다른 JS 연산자 메서드와 일관되도록bool대신JSBoolean을 반환해요.ExternalDartReference가 더 이상Object를 구현하지 않아요. 대신 이제 외부화된 Dart 객체의 타입을 캡처하기 위해Object?경계의 타입 매개변수(T)를 받아요.
dart:typed_data
- Removed — typed data의 수정 불가 뷰 클래스들이 제거됐어요. 이 클래스들의 생성자를 쓰는 대신 typed data 리스트의 새
asUnmodifiableView메서드를 사용해요.
런타임
- Removed — Dart VM이 더 이상 불건전한(unsound) 널 세이프티를 지원하지 않아요.
--no-sound-null-safetyCLI 옵션이 제거됐어요.Dart_NewListOf와Dart_IsLegacyType함수가 C API에서 제거됐어요.- Removed —
Dart_DefaultCanonicalizeUrl함수가 C API에서 제거됐어요.
3.4.0
언어
- 캐스트 패턴의 패턴 컨텍스트 타입 스키마가 이제
Object?대신_(알 수 없는 타입)이에요. - 다트 컴파일러가 맵과 집합 리터럴에서 널 인지 스프레드 연산자(
...?)의 피연산자에 대해 타입 추론을 수행하는 데 사용하는 타입 스키마가, 리스트 리터럴에서 현재 일어나는 일과 일치하도록 널 가능하게 만들어졌어요.
라이브러리
dart:cli
- Experimental Removed —
waitFor함수가 제거됐어요.
dart:html, dart:indexed_db, dart:svg, dart:web_audio, dart:web_gl
- Deprecated — 이 라이브러리들은 이제 레거시로 표시되고 향후 지원이 줄어들 거예요. 새 프로젝트는
package:web과dart:js_interop을 사용하는 것을 선호해야 해요. 자세한 내용은 Migrate to package:web를 확인해요.
dart:js
- Deprecated — 이 라이브러리는 이제 레거시로 표시되고 향후 지원이 줄어들 거예요. 사용처는
dart:js_interop과dart:js_interop_unsafe로 마이그레이션해야 해요. 자세한 내용은 /go/next-gen-js-interop을 확인해요.
dart:js_util
- Deprecated — 이 라이브러리는 이제 레거시로 표시되고 향후 지원이 줄어들 거예요. 사용처는
dart:js_interop과dart:js_interop_unsafe로 마이그레이션해야 해요. 자세한 내용은 /go/next-gen-js-interop을 확인해요.
dart:io
Stdout에 새 필드lineTerminator가 생겼어요. 개발자가 stdout과 stderr가 사용하는 줄 끝을 제어할 수 있게 해 줘요.Stdout를 구현하는 클래스는lineTerminator필드를 정의해야 해요. stdout과 stderr의 기본 의미는 변경되지 않아요.- Deprecated —
FileSystemDeleteEvent.isDirectory프로퍼티. 항상 false를 반환해요.
dart:typed_data
- Deprecated — typed data의 수정 불가 뷰 클래스들이 폐기됐어요. 이 클래스들의 생성자를 쓰는 대신 typed data 리스트의 새
asUnmodifiableView메서드를 사용해요.
도구
프로덕션 JavaScript 컴파일러(dart2js)
- Experimental Deprecated — 이제
--dump-infoCLI 옵션에binary또는json형식을 지정해야 해요.json형식은 폐기되어 향후 다트 릴리스에서 제거될 수 있어요.
Wasm 컴파일러(dart2wasm)
- Experimental — 다양한
dart compile wasmCLI 인자가 업데이트, 제거 또는 교체됐어요. 자세한 내용은dart compile wasm --verbose --help를 실행해요.
런타임
- Removed — Dart VM이 더 이상 외부 문자열(external strings)을 지원하지 않아요. 결과적으로
Dart_IsExternalString,Dart_NewExternalLatin1String,Dart_NewExternalUTF16String함수가 다트 C API에서 제거됐어요.
3.3.0
SDK
- Experimental Removed — 다음 실험들이 다트 3에서 출시되어 언어 버전 3.0 이상에서는 더 이상 필요하지 않으므로 이제 은퇴했어요. 그것들의 구성을 analysis options, CLI 명령, IDE 구성에서 제거해야 해요.
- patterns
- records
- class-modifiers
- sealed-class
언어
- 충돌하는 선언이 없으면 추상 게터가 이제 승격 가능한 것으로 간주돼요.
라이브러리
dart:cli
- Experimental Deprecated —
waitFor함수가 한 릴리스 더 폐기 상태로 남고 다트 3.4에서 제거될 예정이에요.
dart:ffi
- Deprecated —
Pointer타입의elementAt포인터 산술 메서드들이 폐기됐어요. 대신-와+연산자로 마이그레이션해요. - Experimental Removed — 이전에 폐기된
@FfiNative애너테이션이 제거됐어요. 사용처는@Native애너테이션을 사용하도록 업데이트해야 해요.
dart:html
HttpRequest를 직접 사용하는 대신 이제package:http를 사용하는 것을 권장해요.
dart:io
HttpClient를 직접 사용하는 대신 이제package:http를 사용하는 것을 권장해요.
dart:js_interop
- Experimental —
JSAny같은 JS 타입에 컴파일러별 표현 타입이 새로 있어요. - Experimental — 사용자 정의
@staticInterop클래스가 더 이상JSAny나JSObject를 구현할 수 없어요. 사용처는JSObject.fromInteropObject로 마이그레이션하거나 확장 타입으로 정의해야 해요. - Experimental —
JSArray와JSPromise가 이제 제네릭 매개변수를 가져요. - Experimental — 다양한 확장 멤버가 이동하거나 이름이 바뀌었어요. 업데이트된 확장에 대해 알아보려면
JSAnyUtilityExtension과JSAnyOperatorExtension을 참조해요.
dart:typed_data
- typed data의 수정 불가 뷰 클래스들이 다트 3.4에서 폐기될 거예요. 이 클래스들의 생성자를 쓰는 대신 typed data 리스트의 새
asUnmodifiableView메서드를 사용해요.
dart:nativewrappers
- Experimental — 모든 네이티브 래퍼 클래스가 이제
base로 표시되어 그 어떤 서브타입도 구현할 수 없어요.
도구
프로덕션 JavaScript 컴파일러(dart2js)
--minify로 컴파일해도noSuchMethod에 전달되는Invocation에 더 이상 minifiedmemberName이 없어요.
Wasm 컴파일러(dart2wasm)
- Experimental — 레거시 JS interop 라이브러리 임포트를 금지해요. 대신
dart:js_interop과dart:js_interop_unsafe를 사용하는 것을 선호해요.
분석기(Analyzer)
- Experimental — 잘못된 dart doc 주석 지시문이 이제 분석기에 의해 보고돼요.
- 타입 승격 개선 덕분에 다음 분석기 진단이 이전에 분석을 통과했던 기존 코드에서 촉발될 수 있어요.
- unnecessary_non_null_assertion
- unnecessary_cast
- invalid_null_aware_operator
린터(Linter)
iterable_contains_unrelated_type와list_remove_unrelated_type린트가 제거됐어요. 확장된collection_methods_unrelated_type린트로 마이그레이션하는 것을 고려해요.- 사운드 널 세이프티로 더 이상 필요하지 않아 다음 린트들이 제거됐어요.
analysis_options.yaml파일과 모든 ignore 주석에서 그것들의 구성을 제거해야 해요.- always_require_non_null_named_parameters
- avoid_returning_null
- avoid_returning_null_for_future
3.2.0
언어
- Language versioned — refutable 패턴의 분할 지점(split point)을 top-level 패턴으로 변경해서, 스크루티니(scrutinee)가 예외를 던질 수 있는지와 무관하게 if-case 문의 타입 승격이 일관되게 만들어요.
라이브러리
dart:cli
- Experimental Deprecated —
waitFor함수.
dart:convert
utf8.encode()와Utf8Codec.encode()의 반환 타입이List<int>에서Uint8List로 변경됐어요.
dart:developer
- Deprecated —
Service.getIsolateID메서드.
dart:ffi
NativeCallable.nativeFunction이 변경됐어요: 수신자가 이미 닫혀 있으면 nullptr를 반환하는 대신 이제 호출이 오류를 던져요.
dart:io
- HTTP 헤더에서 후행 공백을 제거했어요.
HttpClientResponse.headers와HttpRequest.headers가 반환하는 접힌(folded) 헤더 값의 접는 지점에 공백을 삽입했어요.
dart:js_interop
- Experimental Removed —
JSNumber.toDart를toDartDouble과toDartInt에 유리하게 제거. - Experimental Removed —
Object.toJS를Object.toJSBox에 유리하게 제거. - Experimental —
dart:js_interop을 사용하는 외부 JS interop API를 허용된 타입 집합으로 제한. - Experimental — dart2wasm에서
isNull과isUndefined사용을 금지. - Experimental —
typeofEquals와instanceofAPI를 둘 다JSBoolean대신bool을 반환하도록 변경. 또한typeofEquals가 이제JSString대신String을 받음. - Experimental —
JSAny와JSObject타입을 사용자@staticInterop타입이 구현만 할 수 있고 확장할 수 없도록 변경. - Experimental —
JSArray.withLength가JSNumber대신int를 받도록 변경.
도구
개발 JavaScript 컴파일러(DDC)
- JavaScript
Symbol과BigInt타입에 대한 인터셉터를 추가했어요. 그것들은 더 이상package:js클래스와 함께 사용해서는 안 돼요.
프로덕션 JavaScript 컴파일러(dart2js)
- JavaScript
Symbol과BigInt타입에 대한 인터셉터를 추가했어요. 그것들은 더 이상package:js클래스와 함께 사용해서는 안 돼요.
분석기(Analyzer)
- Language versioned — private final 필드 승격이 이전에 분석을 통과했던 기존 코드에서 다음 분석기 경고를 촉발할 수 있어요.
- unnecessary_non_null_assertion
- invalid_null_aware_operator
- unnecessary_cast
class C {
final num? _x = null;
void test() {
if (_x != null) {
print(_x! * 2); // unnecessary_non_null_assertion
print(_x?.abs()); // invalid_null_aware_operator
}
if (_x is int) {
print((_x as int).bitLength); // unnecessary_cast
}
}
}
3.1.0
라이브러리
dart:async
- 순수 추상 클래스에
interface수정자를 추가했어요:MultiStreamController,StreamConsumer,StreamIterator,StreamTransformer.
dart:io
Cookie클래스에sameSite를 추가하고SameSite클래스를 추가했어요.FileSystemEvent가 sealed됐어요. 이는FileSystemEvent를 확장하거나 구현할 수 없다는 뜻이에요.
dart:js_interop
- Experimental Removed —
ObjectLiteral; 명명 멤버가 없는 객체 리터럴은{}.jsify()로 만들어요.
package:js
external @staticInterop멤버와external확장 멤버를 더 이상 tear-off로 사용할 수 없어요. 이 멤버들을 호출하는 클로저나 non-external 메서드를 선언하고 그것을 사용해요.external @staticInterop멤버와external확장 멤버가 선택 매개변수가 있는 메서드에 대해 약간 다른 JS 코드를 생성할 거예요.
3.0.0
💡 다트 3.0 마이그레이션 가이드가 이 섹션의 모든 변경 사항에 대한 완전한 세부 내용을 다뤄요.
언어
- Language versioned — switch 케이스의 해석을 상수 표현식에서 패턴으로 변경.
- Language versioned — 다트 3.0으로 업그레이드된 라이브러리의 클래스 선언을 기본적으로 mixin으로 사용할 수 없게 됐어요.
- 다트가
continue문이 루프(for,do,while문)나 switch 멤버가 아닌 레이블을 대상으로 하면 컴파일 타임 오류를 보고해요.
라이브러리
- 다음 기존 클래스들이 mixin 클래스로 만들어졌어요:
Iterable,IterableMixin,IterableBase,ListMixin,SetMixin,MapMixin,LinkedListEntry,StringConversionSink.
dart:core
- Deprecated — 폐기된 API.
dart:async
- Removed — 폐기된
DeferredLibrary클래스를 제거.
dart:collection
- Language versioned — 플랫폼 라이브러리의 변경.
dart:developer
- Removed — 폐기된
MAX_USER_TAGS상수를 제거. 대신maxUserTags를 사용. - Removed — 다트 2.0 이후로 깨져 있던 폐기된
Metrics,Metric,Counter,Gauge클래스를 제거.
dart:ffi
- Experimental Deprecated —
@FfiNative애너테이션이 이제 폐기됐어요. 사용처는@Native애너테이션을 사용하도록 업데이트해야 해요.
dart:html
- Removed —
Document와HtmlDocument에서 폐기된registerElement와registerElement2메서드를 제거.
dart:math
- Language versioned —
Random인터페이스를 구현만 할 수 있고 확장할 수 없게 됐어요.
dart:io
vm_service:11.0.0에서 도입된 새Stringid를 수용하도록NetworkProfiling을 업데이트.
2.19.0
언어
Null과Never타입 때문에 추가 코드를 도달할 수 없는 것으로 표시했어요.- 접근할 수 없는 private 이름을
noSuchMethod에 위임하지 않아요. - top-level 타입 추론 중 모든 순환 의존성에 대해 컴파일 타임 오류를 보고해요.
라이브러리
dart:convert
- Removed —
JsonUtf8Encoder의 이전에 폐기된 API[DEFAULT_BUFFER_SIZE]가 제거됐어요.
dart:developer
- Removed —
ServiceExtensionResponse의 이전에 폐기된 APIkInvalidParams,kExtensionError,kExtensionErrorMax,kExtensionErrorMin을 제거.
dart:ffi
- 런타임 타입 인자를 완전히 제거할 준비로
Pointer의 런타임 타입 인자를Never로 변경.Pointer.toString이 어떤 타입 인자도 보고하지 않도록 변경. - Changed —
Pointer.toString이 타입 인자를 보고하지 않도록 변경.
dart:io
- 음수 또는 16진수 content-length 헤더를 금지.
File.create가 이제 새 선택적exclusivebool 매개변수를 받고, true일 때 대상 파일이 이미 존재하면 작업이 실패해요.ResourceHandle.toFile(),ResourceHandle.toSocket(),ResourceHandle.toRawSocket()또는ResourceHandle.toRawDatagramSocket()을 두 번 이상 호출하면 이제StateError를 던져요.
dart:isolate
SendPort.send를 같은 코드를 공유한다고 알려져 있지 않은 격리 사이에 메시지를 보낼 때 메시지 내용에 대한 엄격한 검사로 되돌렸어요.
dart:mirrors
- Removed — API
MirrorsUsed와Comment를 제거.
package:js
- 미리보기 기능
@staticInterop에 대한 호환성 파괴 변경:- 이 애너테이션이 있는 클래스가 external 생성 생성자를 사용하는 것을 금지. 자세한 내용은 48730과 49941 참조.
- 이 애너테이션이 있는 클래스의 external 확장 멤버가 타입 매개변수를 사용하는 것을 금지.
- 이 애너테이션이 있는 클래스는
@JS애너테이션도 가져야 해요. - 이 애너테이션이 있는 클래스를 이 애너테이션이 없는 클래스가 구현할 수 없어요.
dart2js
dart2js가 더 이상 HTTP URI를 입력으로 지원하지 않아요.
2.18.0
언어
Object를 확장하지 않는 클래스의 mixin 지원을 제거했어요.
라이브러리
dart:io
dart:io의RedirectException의uri프로퍼티를 널 가능하게 변경했어요.SCREAMING_CAPS규칙을 따르던dart:io네트워킹 API의 상수를 제거했어요.- Dart VM이 더 이상 종료 시 초기 터미널 설정을 자동으로 복원하지 않아요.
도구
.packages파일을 완전히 중단했어요.
Dart command line
- 독립 실행형
dart2js와dartdevc도구를 제거했어요. - 독립 실행형
dartanalyzer도구를 제거했어요.
2.17.0
라이브러리
dart:io
HttpClient에 새connectionFactory프로퍼티를 추가했어요.HttpClient에 새keyLog프로퍼티를 추가했어요. 디버깅을 위해 TLS 키를 기록할 수 있게 해 줘요.SCREAMING_CAPS규칙을 따르던dart:io의 상수를 제거했어요.SecurityContext에 새allowLegacyUnsafeRenegotiation프로퍼티를 추가했어요. 클라이언트 보안 소켓에 대한 TLS 재협상을 허용해요.
도구
Dart command line
- Deprecated — 독립 실행형
dart2js도구를 폐기. - Deprecated — 독립 실행형
dartdevc도구를 폐기. - Removed — 독립 실행형
dartdoc도구를 제거.
2.16.0
라이브러리
dart:io
- Windows에서
Directory.rename이newPath가 디렉터리를 지정하면 더 이상 디렉터리를 삭제하지 않아요. 대신FileSystemException이 던져질 거예요. - Removed —
Platform.packageRootAPI를 제거.
dart:isolate
- Removed —
Isolate.packageRootAPI를 제거.
도구
Dart command line
- Deprecated — 독립 실행형
dartanalyzer도구를 폐기. - Deprecated — 독립 실행형
dartdoc도구를 폐기. - Removed — 폐기된 독립 실행형
pub도구를 제거.
2.15.0
라이브러리
dart:io
SecurityContext클래스가 최소 TLS 프로토콜 버전을TLS1_VERSION대신TLS1_2_VERSION(1.2)으로 설정하도록 업데이트했어요.
dart:web_sql
dart:web_sql라이브러리를 완전히 삭제했어요.
dart:html
window.openDatabase를 제거했어요(위의dart:web_sql삭제와 관련).
도구
Dart command line
- 독립 실행형
dart2native도구를 제거했어요. - 독립 실행형
dartfmt도구를 제거했어요.
Dart VM
dart-ext:스타일 네이티브 확장 지원을 제거했어요.Isolate.spawn()API로 생성된 격리들을 같은 관리 힙에서 동작하도록 그룹화해서, 다양한 VM 내부 데이터 구조를 공유하게 됐어요.
2.14.0
라이브러리
dart:io
HttpClient의 세터 콜백.authenticate와.authenticateProxy가 이제 널 가능realm인자를 받아들여야 해요(사전 마이그레이션된 널 세이프트 코드용).
dart:typed_data
- 이 라이브러리가 노출하는 대부분의 타입을 더 이상 확장, 구현 또는 믹스인할 수 없어요.
도구
Dart VM
Expando와Dart_NewWeakPersistentHandle,Dart_NewFinalizableHandle의 객체 매개변수가 더 이상Pointer와Struct의 서브타입을 받아들이지 않아요.
Dart command line
- 독립 실행형
dart2native도구를 폐기. - 독립 실행형
dartfmt도구를 폐기.
dart2js
dart2js가 기본적으로 ES6+ JavaScript를 생성하므로 더 이상 레거시 브라우저를 지원하지 않아요.
Dart Dev Compiler(DDC)
package:js클래스의 서브타입 관계를 더 정확하고 Dart2JS와 일관되게 변경했어요.
2.13.0
라이브러리
package:js
- 비익명(non-anonymous) JS interop 클래스의
@JS()애너테이션에서@Native애너테이션과 일치하는String을 사용하는 것이 더 이상 유효하지 않아요.
2.12.0
언어
- 널 세이프티가 이제 거부하지 않은 모든 코드에서 기본적으로 활성화됐어요.
- 확장에서
this가 때때로 타입 승격을 겪던 구현 버그를 수정했어요.
라이브러리
dart:ffi
- Deprecated —
sizeOf<T>,Pointer<T>.elementAt(),Pointer<T extends Struct>.ref,Pointer<T extends Struct>[]의 제네릭T가 있는 호출을 폐기. - Deprecated —
package:ffi의allocate를 폐기. 더 이상sizeOf<T>를 제네릭으로 호출할 수 없게 될 거예요. - Deprecated — 네이티브 멤버가 없는
Struct의 서브타입을 폐기.
도구
Dart VM
- 경쟁 조건을 피하기 위해,
Dart_WeakPersistentHandle이 참조된 객체가 가비지 컬렉션될 때 더 이상 자동으로 자체 삭제되지 않아요. Dart_WeakPersistentHandleFinalizer를Dart_HandleFinalizer로 이름을 바꾸고 handle 인자를 제거했어요.
Pub
pubspec.yaml에 Dart SDK 제약이 이제 필수예요.
2.10.0
도구
Dart VM
dart_api_dl.cc를dart_api_dl.c로 이름을 바꾸고 순수 C 파일로 변경했어요.
2.9.0
라이브러리
dart:convert
- 쌍이 없는 서로게이트(surrogates)를 포함하는 문자열을 UTF-8로 인코딩할 때, 쌍이 없는 서로게이트가 대체 문자(U+FFFD)로 인코딩돼요.
- UTF-8을 디코딩할 때, 인코딩된 서로게이트가 잘못된 입력으로 취급돼요.
allowMalformed: true로 UTF-8을 디코딩할 때 잘못된 입력 시퀀스에 대해 방출되는 대체 문자의 수를 WHATWG 인코딩 표준과 일치하도록 변경했어요.
dart:html
CssClassSet.add()와CssClassSet.toggle이CssClassSet이 여러 요소에 대응할 때null대신false를 반환해요.
dart:mirrors
- 웹 컴파일러(dart2js와 DDC)가
dart:mirrors가 임포트되면 컴파일 타임 오류를 생성해요.
도구
Dart VM
print함수로 문자열을 출력할 때, 기본 구현이 문자열의 쌍이 없는 서로게이트를 대체 문자(U+FFFD)로 출력해요.- Dart API의
Dart_StringToUTF8함수가 쌍이 없는 서로게이트를 대체 문자로 변환해요.
2.8.1
언어
- 지역 변수 추론이 타입 변수의 승격된 타입을 잘못 사용하던 구현 버그를 수정했어요.
implements Function,extends Function, 또는with Function절이 다트 2.0.0 이후로 효과가 없던 것 주변의 구현 버그를 수정했어요.
라이브러리
dart:async
StreamSubscription.cancel()의 반환 타입을Future<void>로 변경했어요.runZoned()함수를 두 함수로 분리했어요:runZoned()와runZonedGuarded(). 후자는 필수onError매개변수가 있고 전자는 없어요.Completer.completeError(),Stream.addError(),Future.error()등에 전달되는 오류가 더 이상 null일 수 없어요.- 스택 트레이스를 널 불가로 만들었어요.
dart:core
RuneIterator의 세 멤버가 첫moveNext()호출 전에 접근할 때 더 이상 null을 반환하지 않아요.String.fromEnvironment()의defaultValue기본값이 이제 null 대신 빈 문자열이에요.int.fromEnvironment()의defaultValue매개변수 기본값이 이제 0이에요.
dart:ffi
Pointer.asFunction()과DynamicLibrary.lookupFunction()을 확장 메서드로 변경했어요.
dart:io
HttpHeaders메서드add()와set의 시그니처를 변경했어요.Socket클래스가 소켓 옵션을 설정하거나 가져올 때 소켓이 명시적으로 파괴되거나 보안 소켓으로 업그레이드됐다면 이제SocketException을 던져요.Process클래스가exitCode게터에 접근할 때 프로세스가 분리되어 있으면(ProcessStartMode.detached와ProcessStartMode.detachedWithStdio) 이제StateError를 던져요.Process클래스가stdin,stdout,stderr게터에 접근할 때 자식 프로세스의 stdio에 연결되어 있지 않으면(ProcessStartMode.detached와ProcessStartMode.inheritStdio) 이제 던져요.FileStat.stat()또는FileStat.statSync()가 실패할 때 반환되는 더미 객체가 이제accessed,changed,modified게터에 대해 null 대신 Unix epoch 타임스탬프를 포함해요.HeaderValue클래스가 이제 두 가지 잘못된 경계 사례에서 더 엄격하게 파싱해요.
도구
Dart Dev Compiler(DDC)
DDC와 Dart2JS 사이의 여러 불일치를 수정해서, 한 컴파일러가 받아들이는데 다른 컴파일러에서 실패하는 코드를 덜 자주 마주치게 했어요.
- DDC의 레거시(분석기 기반) 버전을 삭제했어요.
- 권장
package:jsinterop 명세를 사용해 JavaScript에 전달되는 함수는 이제allowInterop호출로 래핑해야 해요. @JS()클래스의 생성자는external로 표시해야 해요.
dart2js
- 대응하는 타입 매개변수 경계는 구조적으로 같기보다(경계 타입 변수 이름 바꾸기와 모든 top 타입 등치에 이르기까지) 이제 서로의 서브타입이기만 하면 돼요.
- 타입이 이제 정규화됐어요.
@JS()클래스의 생성자는external로 표시해야 해요.- 다트 2.0.0에서 숨겨지고 비활성화된
--package-root플래그를 완전히 제거했어요.
2.7.1
- macOS용 Dart SDK가 이제 x64에서만 사용 가능해요.
2.7.0
언어
- 정적 확장 멤버가 접두사와 함께 임포트될 때 접근 가능해요.
라이브러리
dart:io
ServerSocket.bind를 모의하고자 하는 테스트 작성을 돕기 위해IOOverrides.serverSocketBind를 추가했어요.
2.6.0
언어
FutureOr컨텍스트에서Null값을 사용할 때의 추론을 변경했어요. 즉,Null <: FutureOr<T>와 비슷한 형태의 제약이 이제T에 대한 해로Null을 산출해요.
라이브러리
dart:ffi
- API가 이제 정적 확장 멤버를 사용해요.
- 메모리 관리
Pointer.allocate와Pointer.free를 제거했어요. Pointer.offsetBy를 제거했어요. 대신cast와elementAt을 사용해요.
2.5.0
라이브러리
- 여러 핵심 라이브러리의 다양한 메서드와 프로퍼티가
List<int>반환 타입을 선언하던 것을Uint8List반환 타입으로 업데이트했어요.
dart:io
Cookie클래스의 생성자name과value선택적 위치 매개변수가 이제 필수예요.Cookie클래스의name과value세터가 이제 문자열이 허용된 문자 집합으로 만들어지고 null이 아님을 검증해요.
도구
Pub
pub.dev에 게시되는 패키지가 더 이상 git 의존성을 포함할 수 없어요.
2.4.0
언어
- 슈퍼 인터페이스에서 사용되는 타입 변수의 공변성(covariance)이 이제 강제돼요.
라이브러리
dart:isolate
Isolate.resolvePackageUri가dart2js또는 DDC로 컴파일할 때 항상UnsupportedError를 던져요.
dart:async
await for가 null을 스트림으로 허용하던StreamIterator클래스의 버그를 수정했어요.
2.2.0
라이브러리
package:kernel
- Kernel AST API의
InstanceConstant클래스의klass게터가 일관성을 위해classNode로 이름이 바뀌었어요. Link구현을 Windows에서 junction 대신 진짜 심볼릭 링크를 사용하도록 업데이트했어요.
2.1.1
라이브러리
dart:io
- 닫힌
IOSink에 추가하면 이제StateError를 던져요.
도구
Dart VM
dart:mirrors를 사용해 정적 타입을 위반하는 잘못된 방식으로 메서드를 반사적으로 호출할 때의 사운드음 구멍을 수정했어요.
2.1.0
언어
- 2.0.0에서 감지·보고되었어야 할 여러 정적 오류가 지원되지 않았어요. 이것들이 이제 보고되므로, 기존의 잘못된 코드가 새 오류를 보여줄 수 있어요.
- Mixin은 슈퍼클래스를 올바르게 재정의해야 해요.
extends절의 암시적 타입 인자는 클래스 경계를 충족해야 해요.- 인스턴스 멤버는 접두사를 숨겨야 해요.
- 생성자 호출은 선택적
new가 있어도 유효한 문법을 사용해야 해요. - 제네릭 typedef에 대한 타입 인자는 경계를 충족해야 해요.
- 클래스는
FutureOr를 구현할 수 없어요. - 추상 메서드는 구체 메서드를 불건전하게 재정의할 수 없어요.
- 상수 생성자는 비상수 생성자로 리다이렉트할 수 없어요.
- 둘러싸는 클래스와 같은 이름의 세터는 허용되지 않아요.
도구
dart2js
- const map의 중복 키는 허용되지 않고 컴파일 타임 오류를 생성해요.
2.0.0
언어
- 불건전한 선택적 정적 타입 시스템을, 타입 추론과 런타임 검사를 사용하는 사운드 정적 타입 시스템(예전에는 strong mode라고 불림)으로 교체했어요.
async로 표시된 함수가 이제 첫await문까지 동기적으로 실행돼요.
라이브러리
- 핵심 라이브러리의 상수를
SCREAMING_CAPS에서lowerCamelCase로 이름을 바꿨어요. - 핵심 라이브러리 클래스에 많은 새 메서드를 추가했어요. 이 클래스들의 인터페이스를 구현한다면 이것들을 구현해야 해요.
- 웹용 다트를 사용할 때
dart:isolate와dart:mirrors를 더 이상 지원하지 않아요.
도구
Pub
- pub의 transformer 기반 빌드 시스템을 새 빌드 시스템으로 교체했어요.