Move inheritedOfType from Component to Widget so that Switch can use it
diff --git a/packages/flutter/lib/widgets/default_text_style.dart b/packages/flutter/lib/widgets/default_text_style.dart
index 9d810be..c4a763d 100644
--- a/packages/flutter/lib/widgets/default_text_style.dart
+++ b/packages/flutter/lib/widgets/default_text_style.dart
@@ -19,8 +19,8 @@
final TextStyle style;
- static TextStyle of(Component component) {
- DefaultTextStyle result = component.inheritedOfType(DefaultTextStyle);
+ static TextStyle of(Widget widget) {
+ DefaultTextStyle result = widget.inheritedOfType(DefaultTextStyle);
return result == null ? null : result.style;
}
diff --git a/packages/flutter/lib/widgets/framework.dart b/packages/flutter/lib/widgets/framework.dart
index e4a0f98..8b15043 100644
--- a/packages/flutter/lib/widgets/framework.dart
+++ b/packages/flutter/lib/widgets/framework.dart
@@ -272,6 +272,27 @@
return ancestor;
}
+ Set<Type> _dependencies;
+ Inherited inheritedOfType(Type targetType) {
+ if (_dependencies == null)
+ _dependencies = new Set<Type>();
+ _dependencies.add(targetType);
+ Widget ancestor = parent;
+ while (ancestor != null && ancestor.runtimeType != targetType)
+ ancestor = ancestor.parent;
+ return ancestor;
+ }
+
+ void dependenciesChanged() {
+ // This is called if you've use inheritedOfType and the Inherited
+ // ancestor you were provided was changed. For a widget to use Inherited
+ // it needs an implementation of dependenciesChanged. If your widget extends
+ // Component or RenderObjectWrapper this is provided for you automatically.
+ // If you aren't able to extend one of those classes, you need to
+ // provide your own implementation of dependenciesChanged.
+ assert(false);
+ }
+
void remove() {
_renderObject = null;
setParent(null);
@@ -453,10 +474,9 @@
void notifyDescendants() {
final Type ourRuntimeType = runtimeType;
void notifyChildren(Widget child) {
- if (child is Component &&
- child._dependencies != null &&
+ if (child._dependencies != null &&
child._dependencies.contains(ourRuntimeType))
- child._dependenciesChanged();
+ child.dependenciesChanged();
if (child.runtimeType != ourRuntimeType)
child.walkChildren(notifyChildren);
}
@@ -608,17 +628,7 @@
_built.detachRoot();
}
- Set<Type> _dependencies;
- Inherited inheritedOfType(Type targetType) {
- if (_dependencies == null)
- _dependencies = new Set<Type>();
- _dependencies.add(targetType);
- Widget ancestor = parent;
- while (ancestor != null && ancestor.runtimeType != targetType)
- ancestor = ancestor.parent;
- return ancestor;
- }
- void _dependenciesChanged() {
+ void dependenciesChanged() {
// called by Inherited.sync()
_scheduleBuild();
}
@@ -937,6 +947,11 @@
}
}
+ void dependenciesChanged() {
+ // called by Inherited.sync()
+ syncRenderObject(this);
+ }
+
void remove() {
assert(renderObject != null);
_nodeMap.remove(renderObject);
diff --git a/packages/flutter/lib/widgets/switch.dart b/packages/flutter/lib/widgets/switch.dart
index ccdf435..573716d 100644
--- a/packages/flutter/lib/widgets/switch.dart
+++ b/packages/flutter/lib/widgets/switch.dart
@@ -30,47 +30,34 @@
const Size _kSwitchSize = const Size(_kSwitchWidth + 2.0, _kSwitchHeight + 2.0);
const double _kReactionRadius = _kSwitchWidth / 2.0;
-class Switch extends Component {
- Switch({Key key, this.value, this.onChanged}) : super(key: key);
-
- final bool value;
- final ValueChanged onChanged;
-
- Widget build() {
- return new _SwitchWrapper(
- value: value,
- onChanged: onChanged,
- thumbColor: Theme.of(this).accentColor);
- }
-}
-
-// This wrapper class exists only because Switch needs to be a Component in
-// order to get an accent color from a Theme but Components do not know how to
-// host RenderObjects.
-class _SwitchWrapper extends LeafRenderObjectWrapper {
- _SwitchWrapper({Key key, this.value, this.onChanged, this.thumbColor})
+class Switch extends LeafRenderObjectWrapper {
+ Switch({ Key key, this.value, this.onChanged })
: super(key: key);
final bool value;
final ValueChanged onChanged;
- final Color thumbColor;
_RenderSwitch get renderObject => super.renderObject;
_RenderSwitch createNode() => new _RenderSwitch(
- value: value, thumbColor: thumbColor, onChanged: onChanged);
+ value: value,
+ thumbColor: null,
+ onChanged: onChanged
+ );
- void syncRenderObject(_SwitchWrapper old) {
+ void syncRenderObject(Switch old) {
super.syncRenderObject(old);
renderObject.value = value;
renderObject.onChanged = onChanged;
- renderObject.thumbColor = thumbColor;
+ renderObject.thumbColor = Theme.of(this).accentColor;
}
}
class _RenderSwitch extends RenderToggleable {
- _RenderSwitch(
- {bool value, Color thumbColor: _kThumbOffColor, ValueChanged onChanged})
- : _thumbColor = thumbColor,
+ _RenderSwitch({
+ bool value,
+ Color thumbColor: _kThumbOffColor,
+ ValueChanged onChanged
+ }) : _thumbColor = thumbColor,
super(value: value, onChanged: onChanged, size: _kSwitchSize) {}
Color _thumbColor;
diff --git a/packages/flutter/lib/widgets/theme.dart b/packages/flutter/lib/widgets/theme.dart
index b84ff16..fb7cad8 100644
--- a/packages/flutter/lib/widgets/theme.dart
+++ b/packages/flutter/lib/widgets/theme.dart
@@ -23,8 +23,8 @@
static final ThemeData _kFallbackTheme = new ThemeData.fallback();
- static ThemeData of(Component component) {
- Theme theme = component.inheritedOfType(Theme);
+ static ThemeData of(Widget widget) {
+ Theme theme = widget.inheritedOfType(Theme);
return theme == null ? _kFallbackTheme : theme.data;
}