Commit bcd0d8fe authored by Adam Barth's avatar Adam Barth

Remove the flicker from MimicOverlay

There were two problems:

1) When starting the mimic, we put up a bad frame because although we set the
   `begin` value of the animation, we were building using the current `value`,
   which hadn't been updated.

2) When stoping the mimic, we'd dirty a component during didUnmount, which
   wouldn't get cleaned until the next frame. Now we're sure to clean all the
   components before leaving flushBuild.
parent 66e64023
...@@ -116,7 +116,7 @@ abstract class GlobalKey extends Key { ...@@ -116,7 +116,7 @@ abstract class GlobalKey extends Key {
} }
static void _notifyListeners() { static void _notifyListeners() {
assert(!_inRenderDirtyComponents); assert(!_inBuildDirtyComponents);
assert(!Widget._notifyingMountStatus); assert(!Widget._notifyingMountStatus);
assert(_debugDuplicates.isEmpty); assert(_debugDuplicates.isEmpty);
_notifyingListeners = true; _notifyingListeners = true;
...@@ -161,7 +161,7 @@ abstract class Widget { ...@@ -161,7 +161,7 @@ abstract class Widget {
} }
// you should not build the UI tree ahead of time, build it only during build() // you should not build the UI tree ahead of time, build it only during build()
bool _isConstructedDuringBuild() => this is AbstractWidgetRoot || this is App || _inRenderDirtyComponents || _inLayoutCallbackBuilder > 0; bool _isConstructedDuringBuild() => this is AbstractWidgetRoot || this is App || _inBuildDirtyComponents || _inLayoutCallbackBuilder > 0;
Key _key; Key _key;
...@@ -755,7 +755,7 @@ abstract class StatefulComponent extends Component { ...@@ -755,7 +755,7 @@ abstract class StatefulComponent extends Component {
Set<Component> _dirtyComponents = new Set<Component>(); Set<Component> _dirtyComponents = new Set<Component>();
bool _buildScheduled = false; bool _buildScheduled = false;
bool _inRenderDirtyComponents = false; bool _inBuildDirtyComponents = false;
int _inLayoutCallbackBuilder = 0; int _inLayoutCallbackBuilder = 0;
class LayoutCallbackBuilderHandle { bool _active = true; } class LayoutCallbackBuilderHandle { bool _active = true; }
...@@ -793,7 +793,8 @@ void _buildDirtyComponents() { ...@@ -793,7 +793,8 @@ void _buildDirtyComponents() {
if (_shouldLogRenderDuration) if (_shouldLogRenderDuration)
sw = new Stopwatch()..start(); sw = new Stopwatch()..start();
_inRenderDirtyComponents = true; while (!_dirtyComponents.isEmpty) {
_inBuildDirtyComponents = true;
try { try {
sky.tracing.begin('Component.flushBuild'); sky.tracing.begin('Component.flushBuild');
List<Component> sortedDirtyComponents = new List<Component>(); List<Component> sortedDirtyComponents = new List<Component>();
...@@ -813,11 +814,12 @@ void _buildDirtyComponents() { ...@@ -813,11 +814,12 @@ void _buildDirtyComponents() {
} }
} finally { } finally {
_buildScheduled = false; _buildScheduled = false;
_inRenderDirtyComponents = false; _inBuildDirtyComponents = false;
sky.tracing.end('Component.flushBuild'); sky.tracing.end('Component.flushBuild');
} }
Widget._notifyMountStatusChanged(); Widget._notifyMountStatusChanged();
}
if (_shouldLogRenderDuration) { if (_shouldLogRenderDuration) {
sw.stop(); sw.stop();
......
...@@ -70,8 +70,9 @@ class MimicOverlay extends AnimatedComponent { ...@@ -70,8 +70,9 @@ class MimicOverlay extends AnimatedComponent {
setState(() { setState(() {
// TODO(abarth): We need to convert global bounds into local coordinates. // TODO(abarth): We need to convert global bounds into local coordinates.
_mimicBounds.begin = globalToLocal(globalBounds.topLeft) & globalBounds.size; _mimicBounds.begin = globalToLocal(globalBounds.topLeft) & globalBounds.size;
_expandPerformance.forward(); _mimicBounds.value = _mimicBounds.begin;
}); });
_expandPerformance.forward();
} }
Widget build() { Widget build() {
......
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