mirror of
https://github.com/dart-lang/sdk
synced 2024-10-03 00:45:16 +00:00
Update the CHANGELOG for 2.1.0.
This merges all of the entries for the 2.1.0-dev versions. It also incorporates the notes from https://github.com/dart-lang/sdk/issues/34611. Change-Id: I8a95863fbf8735c5cb7a9834b6be89fdc8c06017 Reviewed-on: https://dart-review.googlesource.com/c/82361 Reviewed-by: Leaf Petersen <leafp@google.com> Reviewed-by: Bob Nystrom <rnystrom@google.com> Reviewed-by: Aske Simon Christensen <askesc@google.com> Commit-Queue: Bob Nystrom <rnystrom@google.com>
This commit is contained in:
parent
c1523d45de
commit
460451be99
761
CHANGELOG.md
761
CHANGELOG.md
|
@ -1,9 +1,332 @@
|
||||||
## 2.1.0-dev.XX.0
|
## 2.1.0 - 2018-10-31
|
||||||
|
|
||||||
#### `dart:io`
|
This is a minor version release. The team's focus was mostly on improving
|
||||||
Added new HTTP status codes.
|
performance and stability after the large changes in Dart 2.0.0. Notable
|
||||||
|
changes:
|
||||||
|
|
||||||
|
* We've introduced a dedicated syntax for declaring a mixin. Instead of the
|
||||||
|
`class` keyword, it uses `mixin`:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
mixin SetMixin<E> implements Set<E> {
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The new syntax also enables `super` calls inside mixins.
|
||||||
|
|
||||||
|
* Integer literals now work in double contexts. When passing a literal number
|
||||||
|
to a function that expects a `double`, you no longer need an explicit `.0`
|
||||||
|
at the end of the number. In releases before 2.1, you need code like this
|
||||||
|
when setting a double like `fontSize`:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
TextStyle(fontSize: 18.0)
|
||||||
|
```
|
||||||
|
|
||||||
|
Now you can remove the `.0`:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
TextStyle(fontSize: 18)
|
||||||
|
```
|
||||||
|
|
||||||
|
In releases before 2.1, `fontSize : 18` causes a static error. This was a
|
||||||
|
common mistake and source of friction.
|
||||||
|
|
||||||
|
* **Breaking change:** A number of static errors that should have been
|
||||||
|
detected and reported were not supported in 2.0.0. These are reported now,
|
||||||
|
which means existing incorrect code may show new errors.
|
||||||
|
|
||||||
|
* `dart:core` now exports `Future` and `Stream`. You no longer need to import
|
||||||
|
`dart:async` to use those very common types.
|
||||||
|
|
||||||
|
### Language
|
||||||
|
|
||||||
|
* Introduced a new syntax for mixin declarations.
|
||||||
|
|
||||||
|
```dart
|
||||||
|
mixin SetMixin<E> implements Set<E> {
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Most classes that are intended to be used as mixins are intended to *only*
|
||||||
|
be used as mixins. The library author doesn't want users to be able to
|
||||||
|
construct or subclass the class. The new syntax makes that intent clear and
|
||||||
|
enforces it in the type system. It is an error to extend or construct a type
|
||||||
|
declared using `mixin`. (You can implement it since mixins expose an
|
||||||
|
implicit interface.)
|
||||||
|
|
||||||
|
Over time, we expect most mixin declarations to use the new syntax. However,
|
||||||
|
if you have a "mixin" class where users *are* extending or constructing it,
|
||||||
|
note that moving it to the new syntax is a breaking API change since it
|
||||||
|
prevents users from doing that. If you have a type like this that is a
|
||||||
|
mixin as well as being a concrete class and/or superclass, then the existing
|
||||||
|
syntax is what you want.
|
||||||
|
|
||||||
|
If you need to use a `super` inside a mixin, the new syntax is required.
|
||||||
|
This was previously only allowed with the experimental `--supermixins` flag
|
||||||
|
because it has some complex interactions with the type system. The new
|
||||||
|
syntax addresses those issues and lets you use `super` calls by declaring
|
||||||
|
the superclass constraint your mixin requires:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
class Superclass {
|
||||||
|
superclassMethod() {
|
||||||
|
print("in superclass");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mixin SomeMixin on Superclass {
|
||||||
|
mixinMethod() {
|
||||||
|
// This is OK:
|
||||||
|
super.superclassMethod();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class GoodSub extends Superclass with SomeMixin {}
|
||||||
|
|
||||||
|
class BadSub extends Object with SomeMixin {}
|
||||||
|
// Error: Since the super() call in mixinMethod() can't find a
|
||||||
|
// superclassMethod() to call, this is prohibited.
|
||||||
|
```
|
||||||
|
|
||||||
|
Even if you don't need to use `super` calls, the new mixin syntax is good
|
||||||
|
because it clearly expresses that you intend the type to be mixed in.
|
||||||
|
|
||||||
|
* Allow integer literals to be used in double contexts. An integer literal
|
||||||
|
used in a place where a double is required is now interpreted as a double
|
||||||
|
value. The numerical value of the literal needs to be precisely
|
||||||
|
representable as a double value.
|
||||||
|
|
||||||
|
* Integer literals compiled to JavaScript are now allowed to have any value
|
||||||
|
that can be exactly represented as a JavaScript `Number`. They were
|
||||||
|
previously limited to such numbers that were also representable as signed
|
||||||
|
64-bit integers.
|
||||||
|
|
||||||
|
**(Breaking)** A number of static errors that should have been detected and
|
||||||
|
reported were not supported in 2.0.0. These are reported now, which means
|
||||||
|
existing incorrect code may show new errors:
|
||||||
|
|
||||||
|
* **Setters with the same name as the enclosing class aren't allowed.** (Issue
|
||||||
|
[34225][].) It is not allowed to have a class member with the same name as
|
||||||
|
the enclosing class:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
class A {
|
||||||
|
set A(int x) {}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Dart 2.0.0 incorrectly allows this for setters (only). Dart 2.1.0 rejects
|
||||||
|
it.
|
||||||
|
|
||||||
|
*To fix:* This is unlikely to break anything, since it violates all style
|
||||||
|
guides anyway.
|
||||||
|
|
||||||
|
* **Constant constructors cannot redirect to non-constant constructors.**
|
||||||
|
(Issue [34161][].) It is not allowed to have a constant constructor that
|
||||||
|
redirects to a non-constant constructor:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
class A {
|
||||||
|
const A.foo() : this(); // Redirecting to A()
|
||||||
|
A() {}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Dart 2.0.0 incorrectly allows this. Dart 2.1.0 rejects it.
|
||||||
|
|
||||||
|
*To fix:* Make the target of the redirection a properly const constructor.
|
||||||
|
|
||||||
|
* **Abstract methods may not unsoundly override a concrete method.** (Issue
|
||||||
|
[32014][].) Concrete methods must be valid implementations of their
|
||||||
|
interfaces:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
class A {
|
||||||
|
num get thing => 2.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class B implements A {
|
||||||
|
int get thing;
|
||||||
|
}
|
||||||
|
|
||||||
|
class C extends A with B {}
|
||||||
|
// 'thing' from 'A' is not a valid override of 'thing' from 'B'.
|
||||||
|
|
||||||
|
main() {
|
||||||
|
print(new C().thing.isEven); // Expects an int but gets a double.
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Dart 2.0.0 allows unsound overrides like the above in some cases. Dart 2.1.0
|
||||||
|
rejects them.
|
||||||
|
|
||||||
|
*To fix:* Relax the type of the invalid override, or tighten the type of the
|
||||||
|
overridden method.
|
||||||
|
|
||||||
|
* **Classes can't implement FutureOr.** (Issue [33744][].) Dart doesn't allow
|
||||||
|
classes to implement the FutureOr type:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
class A implements FutureOr<Object> {}
|
||||||
|
```
|
||||||
|
|
||||||
|
Dart 2.0.0 allows classes to implement FutureOr. Dart 2.1.0 does not.
|
||||||
|
|
||||||
|
*To fix:* Don't do this.
|
||||||
|
|
||||||
|
* **Type arguments to generic typedefs must satisfy their bounds.** (Issue
|
||||||
|
[33308][].) If a parameterized typedef specifies a bound, actual arguments
|
||||||
|
must be checked against it:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
class A<X extends int> {}
|
||||||
|
|
||||||
|
typedef F<Y extends int> = A<Y> Function();
|
||||||
|
|
||||||
|
F<num> f = null;
|
||||||
|
```
|
||||||
|
|
||||||
|
Dart 2.0.0 allows bounds violations like `F<num>` above. Dart 2.1.0 rejects
|
||||||
|
them.
|
||||||
|
|
||||||
|
*To fix:* Either remove the bound on the typedef parameter, or pass a valid
|
||||||
|
argument to the typedef.
|
||||||
|
|
||||||
|
* **Constructor invocations must use valid syntax, even with optional `new`.**
|
||||||
|
(Issue [34403][].) Type arguments to generic named constructors go after the
|
||||||
|
class name, not the constructor name, even when used without an explicit
|
||||||
|
`new`:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
class A<T> {
|
||||||
|
A.foo() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
A.foo<String>(); // Incorrect syntax, was accepted in 2.0.0.
|
||||||
|
A<String>.foo(); // Correct syntax.
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Dart 2.0.0 accepts the incorrect syntax when the `new` keyword is left out.
|
||||||
|
Dart 2.1.0 correctly rejects this code.
|
||||||
|
|
||||||
|
*To fix:* Move the type argument to the correct position after the class
|
||||||
|
name.
|
||||||
|
|
||||||
|
* **Instance members should shadow prefixes.** (Issue [34498][].) If the same
|
||||||
|
name is used as an import prefix and as a class member name, then the class
|
||||||
|
member name takes precedence in the class scope.
|
||||||
|
|
||||||
|
```dart
|
||||||
|
import 'dart:core';
|
||||||
|
import 'dart:core' as core;
|
||||||
|
|
||||||
|
class A {
|
||||||
|
core.List get core => null; // "core" refers to field, not prefix.
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Dart 2.0.0 incorrectly resolves the use of `core` in `core.List` to the
|
||||||
|
prefix name. Dart 2.1.0 correctly resolves this to the field name.
|
||||||
|
|
||||||
|
*To fix:* Change the prefix name to something which does not clash with the
|
||||||
|
instance member.
|
||||||
|
|
||||||
|
* **Implicit type arguments in extends clauses must satisfy the class
|
||||||
|
bounds.** (Issue [34532][].) Implicit type arguments for generic classes are
|
||||||
|
computed if not passed explicitly, but when used in an `extends` clause they
|
||||||
|
must be checked for validity:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
class Foo<T> {}
|
||||||
|
|
||||||
|
class Bar<T extends Foo<T>> {}
|
||||||
|
|
||||||
|
class Baz extends Bar {} // Should error because Bar completes to Bar<Foo>
|
||||||
|
```
|
||||||
|
|
||||||
|
Dart 2.0.0 accepts the broken code above. Dart 2.1.0 rejects it.
|
||||||
|
|
||||||
|
*To fix:* Provide explicit type arguments to the superclass that satisfy the
|
||||||
|
bound for the superclass.
|
||||||
|
|
||||||
|
* **Mixins must correctly override their superclasses.** (Issue [34235][].) In
|
||||||
|
some rare cases, combinations of uses of mixins could result in invalid
|
||||||
|
overrides not being caught:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
class A {
|
||||||
|
num get thing => 2.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
class M1 {
|
||||||
|
int get thing => 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
class B = A with M1;
|
||||||
|
|
||||||
|
class M2 {
|
||||||
|
num get thing => 2.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
class C extends B with M2 {} // 'thing' from 'M2' not a valid override.
|
||||||
|
|
||||||
|
main() {
|
||||||
|
M1 a = new C();
|
||||||
|
print(a.thing.isEven); // Expects an int but gets a double.
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Dart 2.0.0 accepts the above example. Dart 2.1.0 rejects it.
|
||||||
|
|
||||||
|
*To fix:* Ensure that overriding methods are correct overrides of their
|
||||||
|
superclasses, either by relaxing the superclass type, or tightening the
|
||||||
|
subclass/mixin type.
|
||||||
|
|
||||||
|
[32014]: https://github.com/dart-lang/sdk/issues/32014
|
||||||
|
[33308]: https://github.com/dart-lang/sdk/issues/33308
|
||||||
|
[33744]: https://github.com/dart-lang/sdk/issues/33744
|
||||||
|
[34161]: https://github.com/dart-lang/sdk/issues/34161
|
||||||
|
[34225]: https://github.com/dart-lang/sdk/issues/34225
|
||||||
|
[34235]: https://github.com/dart-lang/sdk/issues/34235
|
||||||
|
[34403]: https://github.com/dart-lang/sdk/issues/34403
|
||||||
|
[34498]: https://github.com/dart-lang/sdk/issues/34498
|
||||||
|
[34532]: https://github.com/dart-lang/sdk/issues/34532
|
||||||
|
|
||||||
|
### Core libraries
|
||||||
|
|
||||||
|
#### `dart:async`
|
||||||
|
|
||||||
|
* Fixed a bug where calling `stream.take(0).drain(value)` would not correctly
|
||||||
|
forward the `value` through the returned `Future`.
|
||||||
|
* Added a `StreamTransformer.fromBind` constructor.
|
||||||
|
* Updated `Stream.fromIterable` to send a done event after the error when the
|
||||||
|
iterator's `moveNext` throws, and handle if the `current` getter throws
|
||||||
|
(issue [33431][]).
|
||||||
|
|
||||||
|
[33431]: http://dartbug.com/33431
|
||||||
|
|
||||||
|
#### `dart:core`
|
||||||
|
|
||||||
|
* Added `HashMap.fromEntries` and `LinkedHashmap.fromEntries` constructors.
|
||||||
|
* Added `ArgumentError.checkNotNull` utility method.
|
||||||
|
* Made `Uri` parsing more permissive about `[` and `]` occurring in the path,
|
||||||
|
query or fragment, and `#` occurring in fragment.
|
||||||
|
* Exported `Future` and `Stream` from `dart:core`.
|
||||||
|
* Added operators `&`, `|` and `^` to `bool`.
|
||||||
|
* Added missing methods to `UnmodifiableMapMixin`. Some maps intended to
|
||||||
|
be unmodifiable incorrectly allowed new methods added in Dart 2 to
|
||||||
|
succeed.
|
||||||
|
* Deprecated the `provisional` annotation and the `Provisional`
|
||||||
|
annotation class. These should have been removed before releasing Dart 2.0,
|
||||||
|
and they have no effect.
|
||||||
|
|
||||||
#### `dart:html`
|
#### `dart:html`
|
||||||
|
|
||||||
Fixed Service Workers and any Promise/Future API with a Dictionary parameter.
|
Fixed Service Workers and any Promise/Future API with a Dictionary parameter.
|
||||||
|
|
||||||
APIs in dart:html (that take a Dictionary) will receive a Dart Map parameter.
|
APIs in dart:html (that take a Dictionary) will receive a Dart Map parameter.
|
||||||
|
@ -15,324 +338,135 @@ Future - now it does.
|
||||||
This caused a number of breaks especially in Service Workers (register, etc.).
|
This caused a number of breaks especially in Service Workers (register, etc.).
|
||||||
Here is a complete list of the fixed APIs:
|
Here is a complete list of the fixed APIs:
|
||||||
|
|
||||||
* BackgroundFetchManager
|
* BackgroundFetchManager
|
||||||
* `Future<BackgroundFetchRegistration> fetch(String id, Object requests, [Map options])`
|
* `Future<BackgroundFetchRegistration> fetch(String id, Object requests,
|
||||||
|
[Map options])`
|
||||||
|
* CacheStorage
|
||||||
|
* `Future match(/*RequestInfo*/ request, [Map options])`
|
||||||
|
* CanMakePayment
|
||||||
|
* `Future<List<Client>> matchAll([Map options])`
|
||||||
|
* CookieStore
|
||||||
|
* `Future getAll([Map options])`
|
||||||
|
* `Future set(String name, String value, [Map options])`
|
||||||
|
* CredentialsContainer
|
||||||
|
* `Future get([Map options])`
|
||||||
|
* `Future create([Map options])`
|
||||||
|
* ImageCapture
|
||||||
|
* `Future setOptions(Map photoSettings)`
|
||||||
|
* MediaCapabilities
|
||||||
|
* `Future<MediaCapabilitiesInfo> decodingInfo(Map configuration)`
|
||||||
|
* `Future<MediaCapabilitiesInfo> encodingInfo(Map configuration)`
|
||||||
|
* MediaStreamTrack
|
||||||
|
* `Future applyConstraints([Map constraints])`
|
||||||
|
* Navigator
|
||||||
|
* `Future requestKeyboardLock([List<String> keyCodes])`
|
||||||
|
* `Future requestMidiAccess([Map options])`
|
||||||
|
* `Future share([Map data])`
|
||||||
|
* OffscreenCanvas
|
||||||
|
* `Future<Blob> convertToBlob([Map options])`
|
||||||
|
* PaymentInstruments
|
||||||
|
* `Future set(String instrumentKey, Map details)`
|
||||||
|
* Permissions
|
||||||
|
* `Future<PermissionStatus> query(Map permission)`
|
||||||
|
* `Future<PermissionStatus> request(Map permissions)`
|
||||||
|
* `Future<PermissionStatus> revoke(Map permission)`
|
||||||
|
* PushManager
|
||||||
|
* `Future permissionState([Map options])`
|
||||||
|
* `Future<PushSubscription> subscribe([Map options])`
|
||||||
|
* RtcPeerConnection
|
||||||
|
* Changed:
|
||||||
|
|
||||||
* CacheStorage
|
```dart
|
||||||
* `Future match(/*RequestInfo*/ request, [Map options])`
|
Future createAnswer([options_OR_successCallback,
|
||||||
|
RtcPeerConnectionErrorCallback failureCallback,
|
||||||
|
Map mediaConstraints])
|
||||||
|
```
|
||||||
|
|
||||||
* CanMakePayment
|
to:
|
||||||
* `Future<List<Client>> matchAll([Map options])`
|
|
||||||
|
|
||||||
* CookieStore
|
```dart
|
||||||
* `Future getAll([Map options])`
|
Future<RtcSessionDescription> createAnswer([Map options])
|
||||||
* `Future set(String name, String value, [Map options])`
|
```
|
||||||
|
|
||||||
* CredentialsContainer
|
* Changed:
|
||||||
* `Future get([Map options])`
|
|
||||||
* `Future create([Map options])`
|
|
||||||
|
|
||||||
* ImageCapture
|
```dart
|
||||||
* `Future setOptions(Map photoSettings)`
|
Future createOffer([options_OR_successCallback,
|
||||||
|
RtcPeerConnectionErrorCallback failureCallback,
|
||||||
|
Map rtcOfferOptions])
|
||||||
|
```
|
||||||
|
|
||||||
* MediaCapabilities
|
to:
|
||||||
* `Future<MediaCapabilitiesInfo> decodingInfo(Map configuration)`
|
|
||||||
* `Future<MediaCapabilitiesInfo> encodingInfo(Map configuration)`
|
|
||||||
|
|
||||||
* MediaStreamTrack
|
```dart
|
||||||
* `Future applyConstraints([Map constraints])`
|
Future<RtcSessionDescription> createOffer([Map options])
|
||||||
|
```
|
||||||
|
|
||||||
* Navigator
|
* Changed:
|
||||||
* `Future requestKeyboardLock([List<String> keyCodes])`
|
|
||||||
* `Future requestMidiAccess([Map options])`
|
|
||||||
* `Future share([Map data])`
|
|
||||||
|
|
||||||
* OffscreenCanvas
|
```dart
|
||||||
* `Future<Blob> convertToBlob([Map options])`
|
Future setLocalDescription(Map description,
|
||||||
|
VoidCallback successCallback,
|
||||||
|
[RtcPeerConnectionErrorCallback failureCallback])
|
||||||
|
```
|
||||||
|
|
||||||
* PaymentInstruments
|
to:
|
||||||
* `Future set(String instrumentKey, Map details)`
|
|
||||||
|
|
||||||
* Permissions
|
```dart
|
||||||
* `Future<PermissionStatus> query(Map permission)`
|
Future setLocalDescription(Map description)
|
||||||
* `Future<PermissionStatus> request(Map permissions)`
|
```
|
||||||
* `Future<PermissionStatus> revoke(Map permission)`
|
|
||||||
|
|
||||||
* PushManager
|
* Changed:
|
||||||
* `Future permissionState([Map options])`
|
|
||||||
* `Future<PushSubscription> subscribe([Map options])`
|
|
||||||
|
|
||||||
* RtcPeerConnection
|
```dart
|
||||||
* **CHANGED**
|
Future setLocalDescription(Map description,
|
||||||
|
VoidCallback successCallback,
|
||||||
|
[RtcPeerConnectionErrorCallback failureCallback])
|
||||||
|
```
|
||||||
|
|
||||||
```dart
|
to:
|
||||||
Future createAnswer([options_OR_successCallback,
|
|
||||||
RtcPeerConnectionErrorCallback failureCallback,
|
|
||||||
Map mediaConstraints])
|
|
||||||
```
|
|
||||||
|
|
||||||
to
|
```dart
|
||||||
|
Future setRemoteDescription(Map description)
|
||||||
|
```
|
||||||
|
|
||||||
`Future<RtcSessionDescription> createAnswer([Map options])`
|
* ServiceWorkerContainer
|
||||||
|
* `Future<ServiceWorkerRegistration> register(String url, [Map options])`
|
||||||
* **CHANGED**
|
* ServiceWorkerRegistration
|
||||||
|
* `Future<List<Notification>> getNotifications([Map filter])`
|
||||||
```dart
|
* `Future showNotification(String title, [Map options])`
|
||||||
Future createOffer([options_OR_successCallback,
|
* VRDevice
|
||||||
RtcPeerConnectionErrorCallback failureCallback,
|
* `Future requestSession([Map options])`
|
||||||
Map rtcOfferOptions])
|
* `Future supportsSession([Map options])`
|
||||||
```
|
* VRSession
|
||||||
|
* `Future requestFrameOfReference(String type, [Map options])`
|
||||||
to
|
* Window
|
||||||
|
* `Future fetch(/*RequestInfo*/ input, [Map init])`
|
||||||
`Future<RtcSessionDescription> createOffer([Map options])`
|
* WorkerGlobalScope
|
||||||
|
* `Future fetch(/*RequestInfo*/ input, [Map init])`
|
||||||
* **CHANGED**
|
|
||||||
|
|
||||||
```dart
|
|
||||||
Future setLocalDescription(Map description, VoidCallback successCallback,
|
|
||||||
[RtcPeerConnectionErrorCallback failureCallback])
|
|
||||||
```
|
|
||||||
|
|
||||||
to
|
|
||||||
|
|
||||||
`Future setLocalDescription(Map description)`
|
|
||||||
* **CHANGED**
|
|
||||||
|
|
||||||
```dart
|
|
||||||
Future setLocalDescription(Map description, VoidCallback successCallback,
|
|
||||||
[RtcPeerConnectionErrorCallback failureCallback])
|
|
||||||
```
|
|
||||||
|
|
||||||
to
|
|
||||||
|
|
||||||
`Future setRemoteDescription(Map description)`
|
|
||||||
|
|
||||||
* ServiceWorkerContainer
|
|
||||||
* `Future<ServiceWorkerRegistration> register(String url, [Map options])`
|
|
||||||
|
|
||||||
* ServiceWorkerRegistration
|
|
||||||
* `Future<List<Notification>> getNotifications([Map filter])`
|
|
||||||
* `Future showNotification(String title, [Map options])`
|
|
||||||
|
|
||||||
* VRDevice
|
|
||||||
* `Future requestSession([Map options])`
|
|
||||||
* `Future supportsSession([Map options])`
|
|
||||||
|
|
||||||
* VRSession
|
|
||||||
* `Future requestFrameOfReference(String type, [Map options])`
|
|
||||||
|
|
||||||
* Window
|
|
||||||
* `Future fetch(/*RequestInfo*/ input, [Map init])`
|
|
||||||
|
|
||||||
* WorkerGlobalScope
|
|
||||||
* `Future fetch(/*RequestInfo*/ input, [Map init])`
|
|
||||||
|
|
||||||
In addition, exposed Service Worker "self" as a static getter named "instance".
|
In addition, exposed Service Worker "self" as a static getter named "instance".
|
||||||
The instance is exposed on four different Service Worker classes and can throw
|
The instance is exposed on four different Service Worker classes and can throw
|
||||||
a InstanceTypeError if the instance isn't of the class expected
|
a InstanceTypeError if the instance isn't of the class expected
|
||||||
(WorkerGlobalScope.instance will always work and not throw):
|
(WorkerGlobalScope.instance will always work and not throw):
|
||||||
|
|
||||||
* SharedWorkerGlobalScope.instance
|
* `SharedWorkerGlobalScope.instance`
|
||||||
* DedicatedWorkerGlobalScope.instance
|
* `DedicatedWorkerGlobalScope.instance`
|
||||||
* ServiceWorkerGlobalScope.instance
|
* `ServiceWorkerGlobalScope.instance`
|
||||||
* WorkerGlobalScope.instance
|
* `WorkerGlobalScope.instance`
|
||||||
|
|
||||||
|
#### `dart:io`
|
||||||
|
|
||||||
### Language
|
* Added new HTTP status codes.
|
||||||
|
|
||||||
* Allow integer literals to be used in double contexts.
|
### Dart for the Web
|
||||||
An integer literal used in a place where a double is required is now
|
|
||||||
interpreted as a double value. The numerical value of the literal needs
|
|
||||||
to be precisely representable as a double value.
|
|
||||||
|
|
||||||
* Integer literals compiled to JavaScript are now allowed to have any
|
|
||||||
value that can be exactly represented as a JavaScript `Number`.
|
|
||||||
They were previously limited to such numbers that were also representable
|
|
||||||
as signed 64-bit integers.
|
|
||||||
|
|
||||||
### Core library changes
|
|
||||||
|
|
||||||
* Add `HashMap.fromEntries` and `LinkedHashmap.fromEntries` constructors.
|
|
||||||
* Add `ArgumentError.checkNotNull` utility method.
|
|
||||||
|
|
||||||
### Dart VM
|
|
||||||
|
|
||||||
### Tool Changes
|
|
||||||
|
|
||||||
#### Linter
|
|
||||||
|
|
||||||
Bumped the linter to `0.1.70` which includes the following new lints:
|
|
||||||
|
|
||||||
* `avoid_returning_null_for_void`
|
|
||||||
* `sort_pub_dependencies`
|
|
||||||
* `prefer_mixin`
|
|
||||||
* `avoid_implementing_value_types`
|
|
||||||
* `flutter_style_todos`
|
|
||||||
* `avoid_void_async`
|
|
||||||
* `prefer_void_to_null`
|
|
||||||
|
|
||||||
and improvements:
|
|
||||||
|
|
||||||
* fix NPE in `prefer_iterable_whereType`
|
|
||||||
* improved message display for `await_only_futures`
|
|
||||||
* performance improvements for `null_closures`
|
|
||||||
* mixin support
|
|
||||||
* update to `sort_constructors_first` to apply to all members
|
|
||||||
* update `unnecessary_this` to work on field initializers
|
|
||||||
* updated `unawaited_futures` to ignore assignments within cascades
|
|
||||||
* improved handling of constant expressions with generic type params
|
|
||||||
* NPE fix for `invariant_booleans`
|
|
||||||
* improved docs for `unawaited_futures`
|
|
||||||
* `unawaited_futures` updated to check cascades
|
|
||||||
* relaxed `void_checks` (allowing `T Function()` to be assigned to `void Function()`)
|
|
||||||
* fixed false positives in `lines_longer_than_80_chars`
|
|
||||||
|
|
||||||
#### Pub
|
|
||||||
|
|
||||||
#### dart2js
|
#### dart2js
|
||||||
|
|
||||||
* Breaking change: duplicate keys in a const map are not allowed and produce a
|
* **(Breaking)** Duplicate keys in a const map are not allowed and produce a
|
||||||
compile-time error. Dart2js used to report this as a warning before. Note
|
compile-time error. Dart2js used to report this as a warning before. This
|
||||||
this is already an error in dartanalyzer and DDC and will be an error in
|
was already an error in dartanalyzer and DDC and will be an error in other
|
||||||
other tools in the future as well.
|
tools in the future as well.
|
||||||
|
|
||||||
#### Other Tools
|
|
||||||
|
|
||||||
## 2.1.0-dev.7.0
|
|
||||||
|
|
||||||
### Language
|
|
||||||
|
|
||||||
* Fixed a bug (issue [32014](http://dartbug.com/32014)) that caused invalid
|
|
||||||
implementations of the interface of a class to not be reported in some cases.
|
|
||||||
For instance, the following code would not produce a compile-time error:
|
|
||||||
|
|
||||||
```dart
|
|
||||||
class A {
|
|
||||||
num get thing => 2.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract class B implements A {
|
|
||||||
int get thing;
|
|
||||||
}
|
|
||||||
|
|
||||||
class C extends A with B {} // 'thing' from 'A' is not a valid override of 'thing' from 'B'.
|
|
||||||
|
|
||||||
main() {
|
|
||||||
print(new C().thing.isEven); // Expects an int but gets a double.
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
* Fixed a bug (issue [34235](http://dartbug.com/34235)) that caused invalid
|
|
||||||
overrides between a mixin member and an overridden member in the superclass
|
|
||||||
of the mixin application to not be reported. For instance, the following
|
|
||||||
code would not produce a compile-time error:
|
|
||||||
|
|
||||||
```dart
|
|
||||||
class A {
|
|
||||||
int get thing => 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
class B {
|
|
||||||
num get thing => 2.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
class C extends A with B {} // 'thing' from 'B' is not a valid override of 'thing' from 'A'.
|
|
||||||
|
|
||||||
main() {
|
|
||||||
A a = new C();
|
|
||||||
print(a.thing.isEven); // Expects an int but gets a double.
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Core library changes
|
|
||||||
|
|
||||||
#### `dart:core`
|
|
||||||
|
|
||||||
* Made `Uri` parsing more permissive about `[` and `]` occurring
|
|
||||||
in the path, query or fragment, and `#` occurring in fragment.
|
|
||||||
|
|
||||||
## 2.1.0-dev.6.0
|
|
||||||
|
|
||||||
## 2.1.0-dev.5.0
|
|
||||||
|
|
||||||
### Core library changes
|
|
||||||
|
|
||||||
#### `dart:core`
|
|
||||||
|
|
||||||
* Exported `Future` and `Stream` from `dart:core`.
|
|
||||||
* Added operators `&`, `|` and `^` to `bool`.
|
|
||||||
|
|
||||||
#### `dart:async`
|
|
||||||
|
|
||||||
* Fix a bug where calling `stream.take(0).drain(value)` would not correctly
|
|
||||||
forward the `value` through the returned `Future`.
|
|
||||||
* Add a `StreamTransformer.fromBind` constructor.
|
|
||||||
|
|
||||||
## 2.1.0-dev.4.0
|
|
||||||
|
|
||||||
### Core library changes
|
|
||||||
|
|
||||||
#### `dart:core`
|
|
||||||
|
|
||||||
* Added missing methods to `UnmodifiableMapMixin`. Some maps intended to
|
|
||||||
be unmodifiable incorrectly allowed new methods added in Dart 2 to
|
|
||||||
succeed.
|
|
||||||
|
|
||||||
## 2.1.0-dev.3.1
|
|
||||||
|
|
||||||
### Tool Changes
|
|
||||||
|
|
||||||
#### dartanalyzer
|
|
||||||
|
|
||||||
* Fix a bug in analyzer by cherry-picking commit
|
|
||||||
bd9645abad40d14c8cd9197dfb5c9cc45b20e9d6
|
|
||||||
|
|
||||||
## 2.1.0-dev.3.0
|
|
||||||
|
|
||||||
### Core library changes
|
|
||||||
|
|
||||||
#### `dart:async`
|
|
||||||
|
|
||||||
* Update `Stream.fromIterable` to send a done event after the error when the
|
|
||||||
iterator's `moveNext` throws, and handle if the `current` getter throws.
|
|
||||||
Issue [33431](http://dartbug.com/33431).
|
|
||||||
|
|
||||||
## 2.1.0-dev.2.0
|
|
||||||
|
|
||||||
### Tool Changes
|
|
||||||
|
|
||||||
#### dartfmt
|
|
||||||
|
|
||||||
* Upgrade to an intermediate version of dartfmt.
|
|
||||||
* Address several dartfmt issues when used with the new CFE parser.
|
|
||||||
|
|
||||||
### Core library changes
|
|
||||||
|
|
||||||
#### `dart:core`:
|
|
||||||
|
|
||||||
* Deprecated the `provisional` annotation and the `Provisional`
|
|
||||||
annotation class. These should have been removed before releasing Dart 2.0,
|
|
||||||
and they have no effect.
|
|
||||||
|
|
||||||
## 2.1.0-dev.1.0
|
|
||||||
|
|
||||||
### Tool Changes
|
|
||||||
|
|
||||||
#### Pub
|
|
||||||
|
|
||||||
* Rename the `--checked` flag to `pub run` to `--enable-asserts`.
|
|
||||||
|
|
||||||
## 2.1.0-dev.0.0
|
|
||||||
|
|
||||||
### Tool Changes
|
|
||||||
|
|
||||||
#### Pub
|
|
||||||
|
|
||||||
* Pub will no longer delete directories named "packages".
|
|
||||||
* The `--packages-dir` flag is now ignored.
|
|
||||||
|
|
||||||
#### dart2js
|
|
||||||
|
|
||||||
* Added `-O` flag to tune optimization levels. For more details run `dart2js
|
* Added `-O` flag to tune optimization levels. For more details run `dart2js
|
||||||
-h -v`.
|
-h -v`.
|
||||||
|
@ -345,6 +479,47 @@ and improvements:
|
||||||
At this time we recommend to test and debug with `-O1` and to deploy with
|
At this time we recommend to test and debug with `-O1` and to deploy with
|
||||||
`-O3`.
|
`-O3`.
|
||||||
|
|
||||||
|
### Tool Changes
|
||||||
|
|
||||||
|
#### dartfmt
|
||||||
|
|
||||||
|
* Addressed several dartfmt issues when used with the new CFE parser.
|
||||||
|
|
||||||
|
#### Linter
|
||||||
|
|
||||||
|
Bumped the linter to `0.1.70` which includes the following new lints:
|
||||||
|
|
||||||
|
* `avoid_returning_null_for_void`
|
||||||
|
* `sort_pub_dependencies`
|
||||||
|
* `prefer_mixin`
|
||||||
|
* `avoid_implementing_value_types`
|
||||||
|
* `flutter_style_todos`
|
||||||
|
* `avoid_void_async`
|
||||||
|
* `prefer_void_to_null`
|
||||||
|
|
||||||
|
and improvements:
|
||||||
|
|
||||||
|
* Fixed NPE in `prefer_iterable_whereType`.
|
||||||
|
* Improved message display for `await_only_futures`
|
||||||
|
* Performance improvements for `null_closures`
|
||||||
|
* Mixin support
|
||||||
|
* Updated `sort_constructors_first` to apply to all members.
|
||||||
|
* Updated `unnecessary_this` to work on field initializers.
|
||||||
|
* Updated `unawaited_futures` to ignore assignments within cascades.
|
||||||
|
* Improved handling of constant expressions with generic type params.
|
||||||
|
* NPE fix for `invariant_booleans`.
|
||||||
|
* Improved docs for `unawaited_futures`.
|
||||||
|
* Updated `unawaited_futures` to check cascades.
|
||||||
|
* Relaxed `void_checks` (allowing `T Function()` to be assigned to
|
||||||
|
`void Function()`).
|
||||||
|
* Fixed false positives in `lines_longer_than_80_chars`.
|
||||||
|
|
||||||
|
#### Pub
|
||||||
|
|
||||||
|
* Renamed the `--checked` flag to `pub run` to `--enable-asserts`.
|
||||||
|
* Pub will no longer delete directories named "packages".
|
||||||
|
* The `--packages-dir` flag is now ignored.
|
||||||
|
|
||||||
## 2.0.0 - 2018-08-07
|
## 2.0.0 - 2018-08-07
|
||||||
|
|
||||||
This is the first major version release of Dart since 1.0.0, so it contains many
|
This is the first major version release of Dart since 1.0.0, so it contains many
|
||||||
|
|
Loading…
Reference in a new issue