anchor.diff:  
     bool get isDirty => _dirty;
   
  -  Future getValue(String key, [String defaultVal]) {
  -    final String val = _map[key];
  +  Future getValue(String key, [dynamic defaultVal]) {
  +    final val = _map[key];
       return new Future.value(val != null ? val : defaultVal);
     }
   
  -  Future setValue(String key, String value) {
  +  Future setValue(String key, dynamic value) {
       _dirty = true;
       _map[key] = value;
       _controller.add(new PreferenceEvent(this, key, value));
  
positive.code:   /**
     * Get the value for the given key. The value is returned as a [Future].
     */
    Future<String> getValue(String key, [String defaultVal]) {
      if (_map.containsKey(key)) {
        return new Future.value(_map[key]);
      } else {
        return _storageArea.get(key).then((Map<String, String> map) {
          final String val = map == null ? null : map[key];
          return val != null ? val : defaultVal;
        });
      }
  
negative.code:     // Using a completer ensures the correct updating order: source of truth
      // (_storageArea) first, cache (_map) second.
      var completer = new Completer();
      _storageArea.remove(keys).then((Map map) {
        keys.forEach((key) => _map.remove(key));
        completer.complete();
      });
  