mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

We were making local copies of the listener maps, but we were actually iterating the underlying sets. Now we make local copies of the sets. Fixes #803
154 lines
4.2 KiB
Dart
154 lines
4.2 KiB
Dart
import 'package:sky/widgets.dart';
|
|
import 'package:test/test.dart';
|
|
|
|
import 'build_utils.dart';
|
|
|
|
void main() {
|
|
test('Global keys notify add and remove', () {
|
|
GlobalKey globalKey = new GlobalKey();
|
|
Container container;
|
|
|
|
bool syncListenerCalled = false;
|
|
bool removeListenerCalled = false;
|
|
|
|
void syncListener(GlobalKey key, Widget widget) {
|
|
syncListenerCalled = true;
|
|
expect(key, equals(globalKey));
|
|
expect(container, isNotNull);
|
|
expect(widget, equals(container));
|
|
}
|
|
|
|
void removeListener(GlobalKey key) {
|
|
removeListenerCalled = true;
|
|
expect(key, equals(globalKey));
|
|
}
|
|
|
|
WidgetTester tester = new WidgetTester();
|
|
|
|
GlobalKey.registerSyncListener(globalKey, syncListener);
|
|
GlobalKey.registerRemoveListener(globalKey, removeListener);
|
|
tester.pumpFrame(() {
|
|
container = new Container(key: globalKey);
|
|
return container;
|
|
});
|
|
expect(syncListenerCalled, isTrue);
|
|
expect(removeListenerCalled, isFalse);
|
|
|
|
syncListenerCalled = false;
|
|
removeListenerCalled = false;
|
|
tester.pumpFrame(() => new Container());
|
|
expect(syncListenerCalled, isFalse);
|
|
expect(removeListenerCalled, isTrue);
|
|
|
|
syncListenerCalled = false;
|
|
removeListenerCalled = false;
|
|
GlobalKey.unregisterSyncListener(globalKey, syncListener);
|
|
GlobalKey.unregisterRemoveListener(globalKey, removeListener);
|
|
tester.pumpFrame(() {
|
|
container = new Container(key: globalKey);
|
|
return container;
|
|
});
|
|
expect(syncListenerCalled, isFalse);
|
|
expect(removeListenerCalled, isFalse);
|
|
|
|
tester.pumpFrame(() => new Container());
|
|
expect(syncListenerCalled, isFalse);
|
|
expect(removeListenerCalled, isFalse);
|
|
});
|
|
|
|
test('Global key reparenting', () {
|
|
GlobalKey globalKey = new GlobalKey();
|
|
|
|
bool syncListenerCalled = false;
|
|
bool removeListenerCalled = false;
|
|
|
|
void syncListener(GlobalKey key, Widget widget) {
|
|
syncListenerCalled = true;
|
|
}
|
|
|
|
void removeListener(GlobalKey key) {
|
|
removeListenerCalled = true;
|
|
}
|
|
|
|
GlobalKey.registerSyncListener(globalKey, syncListener);
|
|
GlobalKey.registerRemoveListener(globalKey, removeListener);
|
|
WidgetTester tester = new WidgetTester();
|
|
|
|
tester.pumpFrame(() {
|
|
return new Container(
|
|
child: new Container(
|
|
key: globalKey
|
|
)
|
|
);
|
|
});
|
|
expect(syncListenerCalled, isTrue);
|
|
expect(removeListenerCalled, isFalse);
|
|
|
|
tester.pumpFrame(() {
|
|
return new Container(
|
|
key: globalKey,
|
|
child: new Container()
|
|
);
|
|
});
|
|
expect(syncListenerCalled, isTrue);
|
|
expect(removeListenerCalled, isFalse);
|
|
|
|
tester.pumpFrame(() {
|
|
return new Container(
|
|
child: new Container(
|
|
key: globalKey
|
|
)
|
|
);
|
|
});
|
|
expect(syncListenerCalled, isTrue);
|
|
expect(removeListenerCalled, isFalse);
|
|
|
|
GlobalKey.unregisterSyncListener(globalKey, syncListener);
|
|
GlobalKey.unregisterRemoveListener(globalKey, removeListener);
|
|
});
|
|
|
|
test('Global key mutate during iteration', () {
|
|
GlobalKey globalKey = new GlobalKey();
|
|
|
|
bool syncListenerCalled = false;
|
|
bool removeListenerCalled = false;
|
|
|
|
void syncListener(GlobalKey key, Widget widget) {
|
|
GlobalKey.unregisterSyncListener(globalKey, syncListener);
|
|
syncListenerCalled = true;
|
|
}
|
|
|
|
void removeListener(GlobalKey key) {
|
|
GlobalKey.unregisterRemoveListener(globalKey, removeListener);
|
|
removeListenerCalled = true;
|
|
}
|
|
|
|
GlobalKey.registerSyncListener(globalKey, syncListener);
|
|
GlobalKey.registerRemoveListener(globalKey, removeListener);
|
|
WidgetTester tester = new WidgetTester();
|
|
|
|
tester.pumpFrame(() {
|
|
return new Container(key: globalKey);
|
|
});
|
|
expect(syncListenerCalled, isTrue);
|
|
expect(removeListenerCalled, isFalse);
|
|
|
|
syncListenerCalled = false;
|
|
removeListenerCalled = false;
|
|
tester.pumpFrame(() {
|
|
return new Container();
|
|
});
|
|
expect(syncListenerCalled, isFalse);
|
|
expect(removeListenerCalled, isTrue);
|
|
|
|
syncListenerCalled = false;
|
|
removeListenerCalled = false;
|
|
tester.pumpFrame(() {
|
|
return new Container(key: globalKey);
|
|
});
|
|
expect(syncListenerCalled, isFalse);
|
|
expect(removeListenerCalled, isFalse);
|
|
|
|
});
|
|
}
|