| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import '../animation/animated_value.dart'; |
| import '../fn.dart'; |
| import 'dart:mirrors'; |
| |
| abstract class AnimatedComponent extends Component { |
| AnimatedComponent({ Object key }) : super(key: key, stateful: true); |
| |
| var _debugAnimatedFields = new Set<Symbol>(); |
| bool _debugIsNotYetAnimated(Symbol s) { |
| return _debugAnimatedFields.add(s); |
| } |
| |
| animateField(AnimatedValue value, Symbol symbol) { |
| // TODO(rafaelw): Assert symbol is present on |this|, is private and |
| // is over the same parameterized type as the animated value. |
| var mirror = reflect(this); |
| var subscription; |
| |
| assert(_debugIsNotYetAnimated(symbol)); |
| mirror.setField(symbol, value.value); |
| |
| onDidMount(() { |
| subscription = value.onValueChanged.listen((_) { |
| mirror.setField(symbol, value.value); |
| scheduleBuild(); |
| }); |
| }); |
| |
| onDidUnmount(() { |
| if (subscription != null) { |
| subscription.cancel(); |
| subscription = null; |
| } |
| }); |
| } |
| } |