Commit eb90899a authored by Hixie's avatar Hixie

Track global keys globally.

Assert that there are no duplicates.
Export GlobalKey from basic.dart, so that people don't have to import widgets.dart just for that.
Fix the "initialFocus" feature which actually didn't work.
parent 7224089c
...@@ -19,7 +19,7 @@ const EdgeDims _kTextfieldPadding = const EdgeDims.symmetric(vertical: 8.0); ...@@ -19,7 +19,7 @@ const EdgeDims _kTextfieldPadding = const EdgeDims.symmetric(vertical: 8.0);
class Input extends StatefulComponent { class Input extends StatefulComponent {
Input({ Input({
Key key, GlobalKey key,
this.placeholder, this.placeholder,
this.onChanged this.onChanged
}): super(key: key); }): super(key: key);
......
...@@ -22,7 +22,7 @@ import 'package:sky/widgets/widget.dart'; ...@@ -22,7 +22,7 @@ import 'package:sky/widgets/widget.dart';
export 'package:sky/rendering/box.dart' show BackgroundImage, BoxConstraints, BoxDecoration, Border, BorderSide, EdgeDims; export 'package:sky/rendering/box.dart' show BackgroundImage, BoxConstraints, BoxDecoration, Border, BorderSide, EdgeDims;
export 'package:sky/rendering/flex.dart' show FlexDirection, FlexJustifyContent, FlexAlignItems; export 'package:sky/rendering/flex.dart' show FlexDirection, FlexJustifyContent, FlexAlignItems;
export 'package:sky/rendering/object.dart' show Point, Offset, Size, Rect, Color, Paint, Path; export 'package:sky/rendering/object.dart' show Point, Offset, Size, Rect, Color, Paint, Path;
export 'package:sky/widgets/widget.dart' show Key, Widget, Component, StatefulComponent, App, runApp, Listener, ParentDataNode; export 'package:sky/widgets/widget.dart' show Key, GlobalKey, Widget, Component, StatefulComponent, App, runApp, Listener, ParentDataNode;
// PAINTING NODES // PAINTING NODES
......
...@@ -14,11 +14,11 @@ class Focus extends Inherited { ...@@ -14,11 +14,11 @@ class Focus extends Inherited {
Focus({ Focus({
GlobalKey key, GlobalKey key,
GlobalKey initialFocus, this.initialFocus,
Widget child Widget child
}) : super(key: key, child: child); }) : super(key: key, child: child);
GlobalKey initialFocus; final GlobalKey initialFocus;
GlobalKey _currentlyFocusedKey; GlobalKey _currentlyFocusedKey;
GlobalKey get currentlyFocusedKey { GlobalKey get currentlyFocusedKey {
......
...@@ -140,13 +140,46 @@ abstract class Widget { ...@@ -140,13 +140,46 @@ abstract class Widget {
_notifyingMountStatus = false; _notifyingMountStatus = false;
sky.tracing.end("Widget._notifyMountStatusChanged"); sky.tracing.end("Widget._notifyMountStatusChanged");
} }
assert(_debugDuplicateGlobalKeys.isEmpty);
} }
static final Map<GlobalKey, Widget> _globalKeys = new Map<GlobalKey, Widget>();
static final Map<GlobalKey, int> _debugDuplicateGlobalKeys = new Map<GlobalKey, int>();
/// Override this function to learn when this [Widget] enters the widget tree. /// Override this function to learn when this [Widget] enters the widget tree.
void didMount() { } void didMount() {
if (key is GlobalKey) {
assert(() {
if (_globalKeys.containsKey(key)) {
int oldCount = _debugDuplicateGlobalKeys.putIfAbsent(key, () => 1);
assert(oldCount >= 1);
_debugDuplicateGlobalKeys[key] = oldCount + 1;
}
return true;
});
_globalKeys[key] = this;
}
}
/// Override this function to learn when this [Widget] leaves the widget tree. /// Override this function to learn when this [Widget] leaves the widget tree.
void didUnmount() { } void didUnmount() {
if (key is GlobalKey) {
assert(() {
if (_globalKeys.containsKey(key) && _debugDuplicateGlobalKeys.containsKey(key)) {
int oldCount = _debugDuplicateGlobalKeys[key];
assert(oldCount >= 2);
if (oldCount == 2) {
_debugDuplicateGlobalKeys.remove(key);
} else {
_debugDuplicateGlobalKeys[key] = oldCount - 1;
}
}
return true;
});
if (_globalKeys[key] == this)
_globalKeys.remove(key);
}
}
RenderObject _root; RenderObject _root;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment