호환성이 깨지는 변경 및 폐기

호환성이 깨지는 변경 및 폐기

다트의 릴리스별 호환성이 깨지는 변경 목록이에요.

출처: Breaking changes and deprecations

본문

⚠️ 이 페이지는 폐기(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

  • JSFunctionJSExportedDartFunction이 이제 제네릭이에요. JSExportedDartFunction<T>.toDart는 이제 원래 래핑된 함수를 타입 인자 T로 캐스팅하고, isA<JSExportedDartFunction<T>>는 이제 래핑된 함수가 T인지도 확인해요. JSFunctionJSExportedDartFunction의 런타임 타입은 변하지 않아요.

도구

분석기(Analyzer)

  • Deprecatedavoid_private_typedef_functions 린트 규칙이 폐기되고 analysis_options.yaml 파일에서 제거해야 해요.
  • Deprecatedone_member_abstracts 린트 규칙이 폐기되고 analysis_options.yaml 파일에서 제거해야 해요.

포매터(dart format)

  • 컴파일 단위나 중괄호 본문의 끝에 있는 주석 앞의 빈 줄을 추가하지 않게 됐어요.
  • 확장 타입 표현 절(representation clauses)이 이제 primary 생성자 형식 매개변수 목록과 같은 방식으로 포매팅돼요.
  • 후행 쉼표가 보존될 때, 멤버가 있는 enum에서 후행 쉼표가 없으면 ; 앞에 새 줄을 넣지 않게 됐어요.
  • 일부 컬렉션이나 인자가 불필요하게 분할될 수 있던 버그를 수정했어요.
  • Language versioned — 매개변수 목록을 이제 블록 포매팅할 수 있어요.
  • Language versionedas, 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.hDart_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)

  • Deprecatedavoid_null_checks_in_equality_operators 린트 규칙이 폐기되고 analysis_options.yaml 파일에서 제거해야 해요.
  • Deprecatedprefer_final_parameters 린트 규칙이 폐기되고 analysis_options.yaml 파일에서 제거해야 해요.
  • Deprecateduse_if_null_to_convert_nulls_to_bools 린트 규칙이 폐기되고 analysis_options.yaml 파일에서 제거해야 해요.

Wasm 컴파일(dart compile wasm)

  • Removeddart:js_util 또는 package:js를 임포트하는 코드는 이제 WebAssembly로 컴파일할 때 컴파일 오류가 돼요. 이 라이브러리의 어떤 API를 호출해도 런타임 오류가 돼요. 사용처는 dart:js_interopdart:js_interop_unsafe로 마이그레이션해야 해요.

3.10.0

언어

  • 반환 타입을 지정하지 않은 sync*async* 제너레이터 함수는 이제 null 값이 생성되지 않을 때 반환 타입을 올바르게 널 불가로 추론해요. 이것은 불필요한 널 인지 접근 연산자(?.) 같은 불필요한 코드 요소와 관련된 새 진단을 촉발할 수 있어요.

라이브러리

dart:core

  • Uri.parseIPv4AddressUri.parseIPv6Address 함수가 더 이상 IPv4 주소의 앞자리 0을 잘못 허용하지 않아요.
  • DeprecatedRegExpRegExpMatch를 구현하는 능력이 폐기되고 향후 릴리스에서 제거될 예정이에요.

dart:io

  • IOOverrides를 더 이상 구현할 수 없지만 여전히 확장할 수 있어요.

dart:js_interop

  • Uint16ListToJSInt16Array 확장이 Uint16ListToJSUint16Array로 이름이 바뀌었어요.
  • JSUint16ArrayToInt16List 확장이 JSUint16ArrayToUint16List로 이름이 바뀌었어요.
  • Function.toJSCaptureThis 함수가 이제 Function.toJS와 일치하는 추가 컴파일 타임 검사를 일으켜요. 함수가 정적으로 알려진 타입이 없거나, 시그니처에 지원되지 않는 타입이 있거나, 타입 매개변수를 포함하거나, 명명 매개변수가 있으면 호출이 컴파일 타임 오류가 돼요.

도구

SDK

  • dart CLI와 Dart VM이 이제 별도의 실행 파일이 됐고, 순수 Dart VM 실행 파일과 프로세스를 dartvm이라고 불러요. Dart 프로그램은 여전히 dart run으로 실행해야 해요.
  • dart format, dart compile 같은 dart 도구의 하위 명령이 이제 기본 도구의 AOT 컴파일 스냅샷을 실행해요. 성능 개선 외의 기능적 차이는 없어야 하지만, 비호환성을 발견하면 보고해 주세요.
  • Removed — 다트 SDK가 더 이상 IA32를 지원하지 않으므로 dart 도구를 IA32 플랫폼에서 사용할 수 없게 됐어요.

분석기(Analyzer)

  • @experimental로 표시된 멤버를 선언된 패키지 밖에서 사용하면 이제 경고가 돼요.
  • 포함된 analysis options 파일에서 활성화된 린트 규칙이 이제 적절할 때 호환되지 않는 린트 진단을 일으켜요.
  • Removedpackage:meta의 폐기된 @required 애너테이션을 더 이상 지원하지 않아요. 매개변수를 필수로 표시하려면 대신 required 키워드를 사용해요.

Wasm 컴파일(dart compile wasm)

  • dart:js_utilpackage:js가 WebAssembly로 컴파일할 때 더 이상 지원되지 않아요. 이 라이브러리의 어떤 API를 호출해도 런타임 오류가 돼요. 사용처는 dart:js_interopdart:js_interop_unsafe로 마이그레이션해야 해요.
  • JS 컴파일러와 일치시키기 위해, dartify는 이제 Wasm으로 컴파일할 때 JS Promise 객체를 Dart JSValue 객체 대신 Dart Future 객체로 변환해요.

3.9.0

언어

  • Language versioned — 타입 승격, 도달 가능성, 확실한 할당을 계산할 때 이제 널 세이프티가 가정돼요. 결과적으로 개선된 데드 코드 분석이 이전에 분석을 통과했던 기존 코드에서 새 분석기 진단을 촉발할 수 있어요.

도구

  • dart analyze, dart fix 같은 dart 도구의 일부 하위 명령이 이제 기본 도구의 AOT 컴파일 스냅샷을 실행해요. 성능 개선 외의 기능적 차이는 없어야 하지만, 비호환성을 발견하면 보고해 주세요.

Pub

  • Language versioned — 워크스페이스 루트 패키지의 flutter SDK 제약의 상한이 이제 존중돼요. 현재 SDK가 지정된 상한을 충족하지 않으면 dart pub get과 의존성을 가져오는 다른 작업이 실패해요.

Dart build

  • Experimental — 실험적 네이티브 애셋 지원으로 CLI 앱 번들을 빌드하려면 이제 dart build cli 하위 명령을 사용하고 새 --target 옵션으로 앱 진입점을 지정해야 해요.

3.8.0

라이브러리

dart:html

  • RemovedElement.created 생성자가 제거됐어요.
  • dart:html의 네이티브 클래스(예: HtmlElement)를 더 이상 확장할 수 없어요.

도구

분석기(Analyzer)

  • Deprecatedavoid_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)이라 더 이상 사용하거나 접근할 수 없어요.
  • 도달 가능성 분석이 이제 필드가 isas를 사용해 Null로 타입 승격됐는지도 고려해요. 이것은 승격된 지역 변수의 동작을 반영하므로 타입 시스템을 더 자체적으로 일관되게 만들어요. 이 변경이 실제로 차이를 만들 것으로 기대되지는 않아요.

라이브러리

dart:html, dart:indexed_db, dart:svg, dart:web_audio, dart:web_gl, dart:js

  • Deprecated — 이 레거시 웹 라이브러리들이 공식적으로 폐기됐어요. 향후 릴리스에서 제거될 것으로 예상돼요. 프로젝트는 package:webdart:js_interop을 사용하도록 마이그레이션해야 해요. 자세한 내용은 Migrate to package:web를 확인해요.

dart:js, dart:js_util, package:js

  • Deprecated — 이 레거시 JS-interop 라이브러리들이 공식적으로 폐기됐어요. 향후 릴리스에서 제거될 것으로 예상돼요. 프로젝트는 dart:js_interop을 사용하도록 마이그레이션해야 해요. 자세한 내용은 JS interop usage를 확인해요.

도구

분석기(Analyzer)

  • Removedpackage_api_docsunsafe_html 린트 규칙이 제거됐고 analysis_options.yaml 파일에서 제거해야 해요.

포매터(dart format)

  • Language versioned — 포매터가 언어 버전 3.7 이상으로 코드를 포매팅할 때 새 출력을 만들어 내는 새 스타일을 구현해요.
  • Removeddart format--fix 플래그를 더 이상 지원하지 않아요. 비슷한 수정과 그 이상을 적용하려면 analysis options를 구성하고 dart fix를 실행해요.
  • Deprecateddart format--line-length 옵션이 폐기되고 제거 예정이에요. 모든 사용처는 새 --page-width 옵션으로 마이그레이션해야 해요.

3.6.0

언어

  • throw 표현식의 피연산자에 대해 다트가 타입 추론을 수행하는 데 사용하는 컨텍스트가 "알 수 없는 타입"에서 Object로 변경됐어요. 이것은 null을 던지는 것이 합법적이지 않다는 사실을 반영하므로 타입 시스템을 더 자체적으로 일관되게 만들어요. 이 변경이 실제로 차이를 만들 것으로 기대되지는 않아요.

라이브러리

dart:io

  • RemovedPlatform() 생성자가 제거됐어요. Platform의 모든 인스턴스화를 제거해야 해요.
  • HttpClient가 "Location" 헤더가 없는 리다이렉트에 응답할 때 이제 StateError 대신 RedirectException을 던져요.

도구

분석기(Analyzer)

  • Deprecatedpackage_api_docsunsafe_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) 형식 매개변수에서 타입 매개변수를 보존해요.
  • asif 절이 모두 있는 임포트를 올바르게 포매팅해요.

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 값도 지원해요.
  • isTruthynot이 다른 JS 연산자 메서드와 일관되도록 bool 대신 JSBoolean을 반환해요.
  • ExternalDartReference가 더 이상 Object를 구현하지 않아요. 대신 이제 외부화된 Dart 객체의 타입을 캡처하기 위해 Object? 경계의 타입 매개변수(T)를 받아요.

dart:typed_data

  • Removed — typed data의 수정 불가 뷰 클래스들이 제거됐어요. 이 클래스들의 생성자를 쓰는 대신 typed data 리스트의 새 asUnmodifiableView 메서드를 사용해요.

런타임

  • Removed — Dart VM이 더 이상 불건전한(unsound) 널 세이프티를 지원하지 않아요.
  • --no-sound-null-safety CLI 옵션이 제거됐어요.
  • Dart_NewListOfDart_IsLegacyType 함수가 C API에서 제거됐어요.
  • RemovedDart_DefaultCanonicalizeUrl 함수가 C API에서 제거됐어요.

3.4.0

언어

  • 캐스트 패턴의 패턴 컨텍스트 타입 스키마가 이제 Object? 대신 _(알 수 없는 타입)이에요.
  • 다트 컴파일러가 맵과 집합 리터럴에서 널 인지 스프레드 연산자(...?)의 피연산자에 대해 타입 추론을 수행하는 데 사용하는 타입 스키마가, 리스트 리터럴에서 현재 일어나는 일과 일치하도록 널 가능하게 만들어졌어요.

라이브러리

dart:cli

  • Experimental RemovedwaitFor 함수가 제거됐어요.

dart:html, dart:indexed_db, dart:svg, dart:web_audio, dart:web_gl

  • Deprecated — 이 라이브러리들은 이제 레거시로 표시되고 향후 지원이 줄어들 거예요. 새 프로젝트는 package:webdart:js_interop을 사용하는 것을 선호해야 해요. 자세한 내용은 Migrate to package:web를 확인해요.

dart:js

  • Deprecated — 이 라이브러리는 이제 레거시로 표시되고 향후 지원이 줄어들 거예요. 사용처는 dart:js_interopdart:js_interop_unsafe로 마이그레이션해야 해요. 자세한 내용은 /go/next-gen-js-interop을 확인해요.

dart:js_util

  • Deprecated — 이 라이브러리는 이제 레거시로 표시되고 향후 지원이 줄어들 거예요. 사용처는 dart:js_interopdart:js_interop_unsafe로 마이그레이션해야 해요. 자세한 내용은 /go/next-gen-js-interop을 확인해요.

dart:io

  • Stdout에 새 필드 lineTerminator가 생겼어요. 개발자가 stdout과 stderr가 사용하는 줄 끝을 제어할 수 있게 해 줘요. Stdout를 구현하는 클래스는 lineTerminator 필드를 정의해야 해요. stdout과 stderr의 기본 의미는 변경되지 않아요.
  • DeprecatedFileSystemDeleteEvent.isDirectory 프로퍼티. 항상 false를 반환해요.

dart:typed_data

  • Deprecated — typed data의 수정 불가 뷰 클래스들이 폐기됐어요. 이 클래스들의 생성자를 쓰는 대신 typed data 리스트의 새 asUnmodifiableView 메서드를 사용해요.

도구

프로덕션 JavaScript 컴파일러(dart2js)

  • Experimental Deprecated — 이제 --dump-info CLI 옵션에 binary 또는 json 형식을 지정해야 해요. json 형식은 폐기되어 향후 다트 릴리스에서 제거될 수 있어요.

Wasm 컴파일러(dart2wasm)

  • Experimental — 다양한 dart compile wasm CLI 인자가 업데이트, 제거 또는 교체됐어요. 자세한 내용은 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 DeprecatedwaitFor 함수가 한 릴리스 더 폐기 상태로 남고 다트 3.4에서 제거될 예정이에요.

dart:ffi

  • DeprecatedPointer 타입의 elementAt 포인터 산술 메서드들이 폐기됐어요. 대신 -+ 연산자로 마이그레이션해요.
  • Experimental Removed — 이전에 폐기된 @FfiNative 애너테이션이 제거됐어요. 사용처는 @Native 애너테이션을 사용하도록 업데이트해야 해요.

dart:html

  • HttpRequest를 직접 사용하는 대신 이제 package:http를 사용하는 것을 권장해요.

dart:io

  • HttpClient를 직접 사용하는 대신 이제 package:http를 사용하는 것을 권장해요.

dart:js_interop

  • ExperimentalJSAny 같은 JS 타입에 컴파일러별 표현 타입이 새로 있어요.
  • Experimental — 사용자 정의 @staticInterop 클래스가 더 이상 JSAnyJSObject를 구현할 수 없어요. 사용처는 JSObject.fromInteropObject로 마이그레이션하거나 확장 타입으로 정의해야 해요.
  • ExperimentalJSArrayJSPromise가 이제 제네릭 매개변수를 가져요.
  • Experimental — 다양한 확장 멤버가 이동하거나 이름이 바뀌었어요. 업데이트된 확장에 대해 알아보려면 JSAnyUtilityExtensionJSAnyOperatorExtension을 참조해요.

dart:typed_data

  • typed data의 수정 불가 뷰 클래스들이 다트 3.4에서 폐기될 거예요. 이 클래스들의 생성자를 쓰는 대신 typed data 리스트의 새 asUnmodifiableView 메서드를 사용해요.

dart:nativewrappers

  • Experimental — 모든 네이티브 래퍼 클래스가 이제 base로 표시되어 그 어떤 서브타입도 구현할 수 없어요.

도구

프로덕션 JavaScript 컴파일러(dart2js)

  • --minify로 컴파일해도 noSuchMethod에 전달되는 Invocation에 더 이상 minified memberName이 없어요.

Wasm 컴파일러(dart2wasm)

  • Experimental — 레거시 JS interop 라이브러리 임포트를 금지해요. 대신 dart:js_interopdart:js_interop_unsafe를 사용하는 것을 선호해요.

분석기(Analyzer)

  • Experimental — 잘못된 dart doc 주석 지시문이 이제 분석기에 의해 보고돼요.
  • 타입 승격 개선 덕분에 다음 분석기 진단이 이전에 분석을 통과했던 기존 코드에서 촉발될 수 있어요.
    • unnecessary_non_null_assertion
    • unnecessary_cast
    • invalid_null_aware_operator

린터(Linter)

  • iterable_contains_unrelated_typelist_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 DeprecatedwaitFor 함수.

dart:convert

  • utf8.encode()Utf8Codec.encode()의 반환 타입이 List<int>에서 Uint8List로 변경됐어요.

dart:developer

  • DeprecatedService.getIsolateID 메서드.

dart:ffi

  • NativeCallable.nativeFunction이 변경됐어요: 수신자가 이미 닫혀 있으면 nullptr를 반환하는 대신 이제 호출이 오류를 던져요.

dart:io

  • HTTP 헤더에서 후행 공백을 제거했어요.
  • HttpClientResponse.headersHttpRequest.headers가 반환하는 접힌(folded) 헤더 값의 접는 지점에 공백을 삽입했어요.

dart:js_interop

  • Experimental RemovedJSNumber.toDarttoDartDoubletoDartInt에 유리하게 제거.
  • Experimental RemovedObject.toJSObject.toJSBox에 유리하게 제거.
  • Experimentaldart:js_interop을 사용하는 외부 JS interop API를 허용된 타입 집합으로 제한.
  • Experimental — dart2wasm에서 isNullisUndefined 사용을 금지.
  • ExperimentaltypeofEqualsinstanceof API를 둘 다 JSBoolean 대신 bool을 반환하도록 변경. 또한 typeofEquals가 이제 JSString 대신 String을 받음.
  • ExperimentalJSAnyJSObject 타입을 사용자 @staticInterop 타입이 구현만 할 수 있고 확장할 수 없도록 변경.
  • ExperimentalJSArray.withLengthJSNumber 대신 int를 받도록 변경.

도구

개발 JavaScript 컴파일러(DDC)

  • JavaScript SymbolBigInt 타입에 대한 인터셉터를 추가했어요. 그것들은 더 이상 package:js 클래스와 함께 사용해서는 안 돼요.

프로덕션 JavaScript 컴파일러(dart2js)

  • JavaScript SymbolBigInt 타입에 대한 인터셉터를 추가했어요. 그것들은 더 이상 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 RemovedObjectLiteral; 명명 멤버가 없는 객체 리터럴은 {}.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

  • RemovedDocumentHtmlDocument에서 폐기된 registerElementregisterElement2 메서드를 제거.

dart:math

  • Language versionedRandom 인터페이스를 구현만 할 수 있고 확장할 수 없게 됐어요.

dart:io

  • vm_service:11.0.0에서 도입된 새 String id를 수용하도록 NetworkProfiling을 업데이트.

2.19.0

언어

  • NullNever 타입 때문에 추가 코드를 도달할 수 없는 것으로 표시했어요.
  • 접근할 수 없는 private 이름을 noSuchMethod에 위임하지 않아요.
  • top-level 타입 추론 중 모든 순환 의존성에 대해 컴파일 타임 오류를 보고해요.

라이브러리

dart:convert

  • RemovedJsonUtf8Encoder의 이전에 폐기된 API [DEFAULT_BUFFER_SIZE]가 제거됐어요.

dart:developer

  • RemovedServiceExtensionResponse의 이전에 폐기된 API kInvalidParams, kExtensionError, kExtensionErrorMax, kExtensionErrorMin을 제거.

dart:ffi

  • 런타임 타입 인자를 완전히 제거할 준비로 Pointer의 런타임 타입 인자를 Never로 변경. Pointer.toString이 어떤 타입 인자도 보고하지 않도록 변경.
  • ChangedPointer.toString이 타입 인자를 보고하지 않도록 변경.

dart:io

  • 음수 또는 16진수 content-length 헤더를 금지.
  • File.create가 이제 새 선택적 exclusive bool 매개변수를 받고, true일 때 대상 파일이 이미 존재하면 작업이 실패해요.
  • ResourceHandle.toFile(), ResourceHandle.toSocket(), ResourceHandle.toRawSocket() 또는 ResourceHandle.toRawDatagramSocket()을 두 번 이상 호출하면 이제 StateError를 던져요.

dart:isolate

  • SendPort.send를 같은 코드를 공유한다고 알려져 있지 않은 격리 사이에 메시지를 보낼 때 메시지 내용에 대한 엄격한 검사로 되돌렸어요.

dart:mirrors

  • Removed — API MirrorsUsedComment를 제거.

package:js

  • 미리보기 기능 @staticInterop에 대한 호환성 파괴 변경:
    • 이 애너테이션이 있는 클래스가 external 생성 생성자를 사용하는 것을 금지. 자세한 내용은 48730과 49941 참조.
    • 이 애너테이션이 있는 클래스의 external 확장 멤버가 타입 매개변수를 사용하는 것을 금지.
    • 이 애너테이션이 있는 클래스는 @JS 애너테이션도 가져야 해요.
    • 이 애너테이션이 있는 클래스를 이 애너테이션이 없는 클래스가 구현할 수 없어요.

dart2js

  • dart2js가 더 이상 HTTP URI를 입력으로 지원하지 않아요.

2.18.0

언어

  • Object를 확장하지 않는 클래스의 mixin 지원을 제거했어요.

라이브러리

dart:io

  • dart:ioRedirectExceptionuri 프로퍼티를 널 가능하게 변경했어요.
  • SCREAMING_CAPS 규칙을 따르던 dart:io 네트워킹 API의 상수를 제거했어요.
  • Dart VM이 더 이상 종료 시 초기 터미널 설정을 자동으로 복원하지 않아요.

도구

  • .packages 파일을 완전히 중단했어요.

Dart command line

  • 독립 실행형 dart2jsdartdevc 도구를 제거했어요.
  • 독립 실행형 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.renamenewPath가 디렉터리를 지정하면 더 이상 디렉터리를 삭제하지 않아요. 대신 FileSystemException이 던져질 거예요.
  • RemovedPlatform.packageRoot API를 제거.

dart:isolate

  • RemovedIsolate.packageRoot API를 제거.

도구

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

  • ExpandoDart_NewWeakPersistentHandle, Dart_NewFinalizableHandle의 객체 매개변수가 더 이상 PointerStruct의 서브타입을 받아들이지 않아요.

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

  • DeprecatedsizeOf<T>, Pointer<T>.elementAt(), Pointer<T extends Struct>.ref, Pointer<T extends Struct>[]의 제네릭 T가 있는 호출을 폐기.
  • Deprecatedpackage:ffiallocate를 폐기. 더 이상 sizeOf<T>를 제네릭으로 호출할 수 없게 될 거예요.
  • Deprecated — 네이티브 멤버가 없는 Struct의 서브타입을 폐기.

도구

Dart VM

  • 경쟁 조건을 피하기 위해, Dart_WeakPersistentHandle이 참조된 객체가 가비지 컬렉션될 때 더 이상 자동으로 자체 삭제되지 않아요.
  • Dart_WeakPersistentHandleFinalizerDart_HandleFinalizer로 이름을 바꾸고 handle 인자를 제거했어요.

Pub

  • pubspec.yaml에 Dart SDK 제약이 이제 필수예요.

2.10.0

도구

Dart VM

  • dart_api_dl.ccdart_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.toggleCssClassSet이 여러 요소에 대응할 때 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.detachedProcessStartMode.detachedWithStdio) 이제 StateError를 던져요.
  • Process 클래스가 stdin, stdout, stderr 게터에 접근할 때 자식 프로세스의 stdio에 연결되어 있지 않으면(ProcessStartMode.detachedProcessStartMode.inheritStdio) 이제 던져요.
  • FileStat.stat() 또는 FileStat.statSync()가 실패할 때 반환되는 더미 객체가 이제 accessed, changed, modified 게터에 대해 null 대신 Unix epoch 타임스탬프를 포함해요.
  • HeaderValue 클래스가 이제 두 가지 잘못된 경계 사례에서 더 엄격하게 파싱해요.

도구

Dart Dev Compiler(DDC)

DDC와 Dart2JS 사이의 여러 불일치를 수정해서, 한 컴파일러가 받아들이는데 다른 컴파일러에서 실패하는 코드를 덜 자주 마주치게 했어요.

  • DDC의 레거시(분석기 기반) 버전을 삭제했어요.
  • 권장 package:js interop 명세를 사용해 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.allocatePointer.free를 제거했어요.
  • Pointer.offsetBy를 제거했어요. 대신 castelementAt을 사용해요.

2.5.0

라이브러리

  • 여러 핵심 라이브러리의 다양한 메서드와 프로퍼티가 List<int> 반환 타입을 선언하던 것을 Uint8List 반환 타입으로 업데이트했어요.

dart:io

  • Cookie 클래스의 생성자 namevalue 선택적 위치 매개변수가 이제 필수예요.
  • Cookie 클래스의 namevalue 세터가 이제 문자열이 허용된 문자 집합으로 만들어지고 null이 아님을 검증해요.

도구

Pub

  • pub.dev에 게시되는 패키지가 더 이상 git 의존성을 포함할 수 없어요.

2.4.0

언어

  • 슈퍼 인터페이스에서 사용되는 타입 변수의 공변성(covariance)이 이제 강제돼요.

라이브러리

dart:isolate

  • Isolate.resolvePackageUridart2js 또는 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:isolatedart:mirrors를 더 이상 지원하지 않아요.

도구

Pub

  • pub의 transformer 기반 빌드 시스템을 새 빌드 시스템으로 교체했어요.

더 알아보기