Fix runtime cast failures. (#57)

* Fix runtime cast failures.

In strong mode, a generic type instantiated with dynamic is not a
subtype of all types. You can't pass a List<dynamic> to something
expecting, say, List<int>.

These errors are usually detected statically, and most of those have
been fixed. However, sometimes this becomes a runtime cast, as in:

    main() {
      // Store a List<dynamic> in a variable of type dynamic.
      dynamic d = [];

      // Implicit runtime downcast from dynamic to List<String>.
      List<String> s = d;
    }

In order to ease the migration to strong mode, DDC has been ignoring
these cast failures when they involve certain commonly used types. We
are now in the process of actively fixing those errors.

More context: https://github.com/dart-lang/sdk/issues/27223

* Update SDK constraints.

* Use newer dev version of the SDK on Travis.

* Bump minimum SDK constraint.
6 files changed
tree: 3a7afe13c0f2167889654f5b4d8697d2164ee972
  1. .gitignore
  2. .travis.yml
  3. AUTHORS
  4. CHANGELOG.md
  5. CONTRIBUTING.md
  6. LICENSE
  7. PATENTS
  8. README.md
  9. analysis_options.yaml
  10. lib/
  11. pubspec.yaml
  12. test/
README.md

Build Status

Support for detecting and being notified when an object is mutated.

An observable is a way to be notified of a continuous stream of events over time.

Some suggested uses for this library:

  • Observe objects for changes, and log when a change occurs
  • Optimize for observable collections in your own APIs and libraries instead of diffing
  • Implement simple data-binding by listening to streams

You may want to look at the former TC39 proposal Observe.observe, which was deprecated.

Usage

There are two general ways to detect changes:

  • Listen to Observable.changes and be notified when an object changes
  • Use Differ.diff to determine changes between two objects