From 4e2893802d033564a65ecd3983c4c0398cda73f5 Mon Sep 17 00:00:00 2001 From: Hixie Date: Thu, 23 Jul 2015 12:52:13 -0700 Subject: [PATCH] Remove the scheduleBuild() API. I've noticed an anti-pattern emerge where people call scheduleBuild() when they think they've changed enough state that they should rebuild, instead of just wrapping their changes in setState(). This leads to them missing state changes, having extraneous scheduleBuild() calls, and other similar bugs. By removing scheduleBuild(), the only way to actually schedule a build now is to call setState(), and hopefully that'll make it much clearer that you're only supposed to do this when you change state. --- packages/flutter/example/widgets/piano.dart | 1 - .../flutter/lib/widgets/animated_component.dart | 13 ++++++++++--- packages/flutter/lib/widgets/widget.dart | 8 ++++---- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/packages/flutter/example/widgets/piano.dart b/packages/flutter/example/widgets/piano.dart index c976d4ae9c..23737e210b 100644 --- a/packages/flutter/example/widgets/piano.dart +++ b/packages/flutter/example/widgets/piano.dart @@ -68,7 +68,6 @@ class PianoApp extends App { } mediaService.close(); // Are we leaking all the player connections? - scheduleBuild(); } Widget build() { diff --git a/packages/flutter/lib/widgets/animated_component.dart b/packages/flutter/lib/widgets/animated_component.dart index 92683e0945..3ebb9c5567 100644 --- a/packages/flutter/lib/widgets/animated_component.dart +++ b/packages/flutter/lib/widgets/animated_component.dart @@ -13,22 +13,29 @@ abstract class AnimatedComponent extends StatefulComponent { final List _watchedPerformances = new List(); + void _performanceChanged() { + setState(() { + // We don't actually have any state to change, per se, + // we just know that we have in fact changed state. + }); + } + void watch(AnimationPerformance performance) { assert(!_watchedPerformances.contains(performance)); _watchedPerformances.add(performance); if (mounted) - performance.addListener(scheduleBuild); + performance.addListener(_performanceChanged); } void didMount() { for (AnimationPerformance performance in _watchedPerformances) - performance.addListener(scheduleBuild); + performance.addListener(_performanceChanged); super.didMount(); } void didUnmount() { for (AnimationPerformance performance in _watchedPerformances) - performance.removeListener(scheduleBuild); + performance.removeListener(_performanceChanged); super.didUnmount(); } diff --git a/packages/flutter/lib/widgets/widget.dart b/packages/flutter/lib/widgets/widget.dart index a7de0ca712..3624213922 100644 --- a/packages/flutter/lib/widgets/widget.dart +++ b/packages/flutter/lib/widgets/widget.dart @@ -530,7 +530,7 @@ abstract class Component extends Widget { } void _dependenciesChanged() { // called by Inherited.sync() - scheduleBuild(); + _scheduleBuild(); } // order corresponds to _build_ order, not depth in the tree. @@ -585,7 +585,7 @@ abstract class Component extends Widget { _sync(null, _slot); } - void scheduleBuild() { + void _scheduleBuild() { if (_isBuilding || _dirty || !_mounted) return; _dirty = true; @@ -662,7 +662,7 @@ abstract class StatefulComponent extends Component { void setState(void fn()) { assert(!_disqualifiedFromEverAppearingAgain); fn(); - scheduleBuild(); + _scheduleBuild(); } } @@ -1190,7 +1190,7 @@ void runApp(App app, { RenderView renderViewOverride, bool enableProfilingLoop: _container = new AppContainer(app); if (enableProfilingLoop) { new Timer.periodic(const Duration(milliseconds: 20), (_) { - app.scheduleBuild(); + app._scheduleBuild(); }); } }