提交 5156f12b 编写于 作者: H Hixie

Move AnimatedComponent away from mirrors and towards a callback-based setter.

R=abarth@chromium.org

Review URL: https://codereview.chromium.org/1171273002
上级 c3eccc85
......@@ -9,7 +9,7 @@ import 'generators.dart';
typedef void Callback ();
class AnimatedValue {
StreamController _controller = new StreamController.broadcast(sync: true);
StreamController<double> _controller = new StreamController<double>.broadcast(sync: true);
AnimationGenerator _animation;
Completer _completer;
double _value;
......
......@@ -4,32 +4,23 @@
import '../animation/animated_value.dart';
import '../fn2.dart';
import 'dart:mirrors';
import 'dart:async';
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);
}
typedef void SetterFunction(double value);
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;
abstract class AnimatedComponent extends Component {
assert(_debugIsNotYetAnimated(symbol));
mirror.setField(symbol, value.value);
AnimatedComponent({ Object key }) : super(key: key, stateful: true);
animate(AnimatedValue value, SetterFunction setter) {
setter(value.value);
StreamSubscription<double> subscription;
onDidMount(() {
subscription = value.onValueChanged.listen((_) {
mirror.setField(symbol, value.value);
setter(value.value);
scheduleBuild();
});
});
onDidUnmount(() {
if (subscription != null) {
subscription.cancel();
......@@ -37,4 +28,5 @@ abstract class AnimatedComponent extends Component {
}
});
}
}
......@@ -104,7 +104,9 @@ class Drawer extends AnimatedComponent {
this.children,
this.level: 0
}) : super(key: key) {
animateField(controller.position, #_position);
animate(controller.position, (double value) {
_position = value;
});
}
UINode build() {
......
......@@ -61,7 +61,9 @@ class PopupMenu extends AnimatedComponent {
PopupMenu({ Object key, this.controller, this.items, this.level })
: super(key: key) {
animateField(controller.position, #_position);
animate(controller.position, (double value) {
_position = value;
});
// onDidMount(_measureSize);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册