-
Notifications
You must be signed in to change notification settings - Fork 29.7k
Turn off AnimationControllers when not in use #5902
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
I like the end result, but I'm not a huge fan of this API design. Better suggestions welcome. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
single quotes
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there some reason the BuildContext can't serve as the ticker provider?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To make that work (without requiring every widget to also have a custom element) we'd have to bake knowledge about Tickers into framework.dart, which I would be very reluctant to do.
abarth
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok, I'm now convinced that your design is correct. The only substantive issue is with the classes that need to deal with ticker provider changes.
We might want to think of snappier names for the parts that developers are going to type a lot (i.e., the mixins and the argument to AnimationController)...
Maybe instead of TickerProvider, we could call it a Timeline? Dunno. TickerProvider sounds so enterprisy.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe we should get this from the tester? That will make it less likely for people to copy/pasta this into production code.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This was an excellent idea. Done.
As a side-effect it also allows the tester to verify that all these AnimationControllers are disposed as well.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should enabled by @required ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sure, why not. done.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You're inconsistent about whether you're using early return in these two error handlers.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This seems like a very dangerous default.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah. Removed. I've actually removed the schedulerTickerProvider entirely.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This field seems like a bug factory. It's easy to use and your code is only wrong in that it burns battery. Maybe move it to flutter_test, which would service almost all of the clients.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
agreed. removed
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Won't this drop a frame? The oldController.value is the value we had at the last tick but calling forward will cause the first frame of the new control (i.e., next frame) to have that value as well.
Instead, I think we need some way of changing the ticker provider for a running animation, presumably by handing the timebase off between the tickers so they don't repeat a frame.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm pretty sure that forward() will cause this frame to have the value of the from, and the next frame will have advanced.
But I agree that it's cleaner to build the animation controller from the old one, so let me explore that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think you forgot to actually store the new value in _tickerProvider.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
oops fixed
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The problem with this approach is that these animations are exposed publicly by this class. Clients won't expect them to change. Specifically, how will they know to move their child animations onto the new instances?
We could solve that by introducing proxy animations to hide the identity change, but I think it would be better to teach AnimationController how to switch ticker providers, especially because of the frame-repeating problem mentioned in another comment.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done as suggested
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe assert that?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Right now there's no way to tell -- the ticker provider isn't kept around to compare against.
|
Thanks for the excellent comments. I agree with all of them. I'll fix them on Monday. |
|
Maybe State could inherit from TickerProviderStateMixin and include a createAnimationController() method? |
dragostis
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm in totally in favor of this change. I like the mixin approach and feel like this not only improves efficiency but also makes controllers a bit more obvious to use.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
All the parameters could be enclosed with [].
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
added hyperlinks where appropriate
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
flutter before meta?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would 'supply' be a better fit than 'vend'? (I may be missing the nuance here, though.)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think both are fine.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe The type of the provided ticker depends on the implementing class.?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think the text I have now is more grammatically correct. "implementing class" is a bit of a weird construction.
But more to the point, the text here isn't talking about the object type per se, but about the kind of behavior it may have. So for example, you could have a ticker provider return the same type as another, but with different behaviour. Case in point, most of the ticker providers essentially provide Ticker objects, but they don't all act the same.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe it would be useful to add [some of] this explanation to the docs?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, enabled should probably not be null.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
asserted
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
'should' is really not explicit enough here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
what should it say instead?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What I was trying to say is that it does not explain why they should or should not be enabled.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
'used ... to enable and disable' is a bit confusing since this method only returns a bool. Maybe 'use ... when enabling or disabling'?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
tweaked
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
'vending' vs 'supplying'?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
they are both fine. "vending" implies more of a transactional operation which is why i used that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
'This' -> 'That'
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why that?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess 'That' in this particular case underlines the separation of the two ideas. To me, 'This' brings the two closer than they naturally are, but this may be personal bias.
That would unfortunately bloat the memory footprint of all the States even if they don't have an animation controller. Also, I think we should keep the knowledge of this kind of thing out of the framework core. |
|
Thanks for the numerous comments. I've updated the patch. Please take another look since some of the changes are non-trivial. |
abarth
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
You'll probably want to email flutter-dev after landing. 😄
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does the base class not have @mustCallSuper? If not, should we introduce it here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's complicated. The base class is actually a mixin. I tried adding @mustCallSuper the other day but it ends up being a bit of a mess, iirc.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, looks like I cleaned the mess up, too, and we do have it now. La la la.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, clearly we need a @mustCallSuper somewhere.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Always one step ahead, I see.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Bad indent.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@protected if this is for subclasses.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why didn't we use resync here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
oops, I forgot this one.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we null out _startTime as well?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I intentionally didn't so that the class would end up in a bogus state after dispose(). I can add a comment to that effect.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
added:
// We intentionally don't null out _startTime. This means that if start()
// was ever called, the object is now in a bogus state. This weakly helps
// catch cases of use-after-dispose.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should this be called muted to match the property on Ticker?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't have a strong opinion here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess I'll change it to muted for consistency.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actually calling this "muted" here leads to a weird case where you set things to false if they're on, which is weird. I'm not sure what to do.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What's the point of the temporary variable?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
removed
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd use a temporary to avoid making this of query so many times.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
moved it from the other dependenciesChanged. :-)
|
@Hixie Is this cl going to make me cry? |
34e048d to
572af07
Compare
|
(This PR will be delayed a bit while we stabilize for gallery.) |
dragostis
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit: ContinuousVSync?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I was going to make this change but actually that name makes it sound like it fires continually, which is a bit weird...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe it would be useful to add [some of] this explanation to the docs?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit: I would either use a comma after 'Typically' or place it after 'callbacks'.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed x3
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
And here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
'few' rather than 'many'? 😄
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
16 milliseconds is many milliseconds. :-)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
toString should be inside `s.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
toString should be inside `s
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
toString should be inside `s
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
made it [toString]
Not sure what you mean here |
|
PR updated; I will check this in once the gallery launches. |
This requires all AnimationController objects to be given a TickerProvider, a class that can create the Ticker. It also provides some nice mixins for people who want to have their State provide a TickerProvider. And a schedulerTickerProvider for those cases where you just want to see your battery burn. Also, we now enforce destruction order for elements.
|
I shall land this when Travis goes green. Last chance to stop me! :-) |
flutter/engine@af855e0...5b09e14 git log af855e0..5b09e14 --date=short --no-merges --format='%%ad %%ae %%s' 2018-07-30 37626415&flutter#43;[email protected] Roll src/third_party/skia 946a162a5239..0bf5408286ea (1 commits) (flutter#5909) 2018-07-30 [email protected] Add word movement granularities to android (flutter#5902) 2018-07-30 37626415&flutter#43;[email protected] Roll src/third_party/skia f7dcd76c552a..946a162a5239 (3 commits) (flutter#5908) 2018-07-30 [email protected] Remove the &flutter#34;VSYNC&flutter#34; trace event on Fuchsia (flutter#5907) 2018-07-30 37626415&flutter#43;[email protected] Roll src/third_party/skia 62501c12c83e..f7dcd76c552a (5 commits) (flutter#5906) 2018-07-30 [email protected] Replace travis with cirrus (flutter#5899) 2018-07-30 [email protected] Use container and GKE to accelerate build (flutter#5897) 2018-07-30 [email protected] Add docker container generation scripts (flutter#5898) 2018-07-30 37626415&flutter#43;[email protected] Roll src/third_party/skia c06b8a4e0ca3..62501c12c83e (11 commits) (flutter#5905) 2018-07-30 [email protected] Clear the EGL context only if our context is currently active (flutter#5895) 2018-07-30 [email protected] Return proper JSON-RPC error responses from service protocol failures (flutter#5889) 2018-07-30 37626415&flutter#43;[email protected] Roll src/third_party/skia 227424b57d28..c06b8a4e0ca3 (22 commits) (flutter#5904) The AutoRoll server is located here: http://localhost:8000 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+/master/autoroll/README.md If the roll is causing failures, please contact the current sheriff, who should be CC&flutter#39;d on the roll, and stop the roller if necessary.
flutter/engine@af855e0...3e6b681 git log af855e0..3e6b681 --date=short --no-merges --format='%%ad %%ae %%s' 2018-07-31 37626415&flutter#43;[email protected] Roll src/third_party/skia 0bf5408286ea..74c6ed3d1f17 (1 commits) (flutter#5910) 2018-07-30 37626415&flutter#43;[email protected] Roll src/third_party/skia 946a162a5239..0bf5408286ea (1 commits) (flutter#5909) 2018-07-30 [email protected] Add word movement granularities to android (flutter#5902) 2018-07-30 37626415&flutter#43;[email protected] Roll src/third_party/skia f7dcd76c552a..946a162a5239 (3 commits) (flutter#5908) 2018-07-30 [email protected] Remove the &flutter#34;VSYNC&flutter#34; trace event on Fuchsia (flutter#5907) 2018-07-30 37626415&flutter#43;[email protected] Roll src/third_party/skia 62501c12c83e..f7dcd76c552a (5 commits) (flutter#5906) 2018-07-30 [email protected] Replace travis with cirrus (flutter#5899) 2018-07-30 [email protected] Use container and GKE to accelerate build (flutter#5897) 2018-07-30 [email protected] Add docker container generation scripts (flutter#5898) 2018-07-30 37626415&flutter#43;[email protected] Roll src/third_party/skia c06b8a4e0ca3..62501c12c83e (11 commits) (flutter#5905) 2018-07-30 [email protected] Clear the EGL context only if our context is currently active (flutter#5895) 2018-07-30 [email protected] Return proper JSON-RPC error responses from service protocol failures (flutter#5889) 2018-07-30 37626415&flutter#43;[email protected] Roll src/third_party/skia 227424b57d28..c06b8a4e0ca3 (22 commits) (flutter#5904) The AutoRoll server is located here: http://localhost:8000 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+/master/autoroll/README.md If the roll is causing failures, please contact the current sheriff, who should be CC&flutter#39;d on the roll, and stop the roller if necessary.
flutter/engine@af855e0...d06e9e8 git log af855e0..d06e9e8 --date=short --no-merges --format='%%ad %%ae %%s' 2018-07-31 [email protected] Deprecate -[FlutterDartProject initFromDefaultSourceForConfiguration] (flutter#18886) (flutter#5858) 2018-07-31 37626415&flutter#43;[email protected] Roll src/third_party/skia 0bf5408286ea..74c6ed3d1f17 (1 commits) (flutter#5910) 2018-07-30 37626415&flutter#43;[email protected] Roll src/third_party/skia 946a162a5239..0bf5408286ea (1 commits) (flutter#5909) 2018-07-30 [email protected] Add word movement granularities to android (flutter#5902) 2018-07-30 37626415&flutter#43;[email protected] Roll src/third_party/skia f7dcd76c552a..946a162a5239 (3 commits) (flutter#5908) 2018-07-30 [email protected] Remove the &flutter#34;VSYNC&flutter#34; trace event on Fuchsia (flutter#5907) 2018-07-30 37626415&flutter#43;[email protected] Roll src/third_party/skia 62501c12c83e..f7dcd76c552a (5 commits) (flutter#5906) 2018-07-30 [email protected] Replace travis with cirrus (flutter#5899) 2018-07-30 [email protected] Use container and GKE to accelerate build (flutter#5897) 2018-07-30 [email protected] Add docker container generation scripts (flutter#5898) 2018-07-30 37626415&flutter#43;[email protected] Roll src/third_party/skia c06b8a4e0ca3..62501c12c83e (11 commits) (flutter#5905) 2018-07-30 [email protected] Clear the EGL context only if our context is currently active (flutter#5895) 2018-07-30 [email protected] Return proper JSON-RPC error responses from service protocol failures (flutter#5889) 2018-07-30 37626415&flutter#43;[email protected] Roll src/third_party/skia 227424b57d28..c06b8a4e0ca3 (22 commits) (flutter#5904) The AutoRoll server is located here: http://localhost:8000 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+/master/autoroll/README.md If the roll is causing failures, please contact the current sheriff, who should be CC&flutter#39;d on the roll, and stop the roller if necessary.
flutter/engine@af855e0...91ff524 git log af855e0..91ff524 --date=short --no-merges --format='%%ad %%ae %%s' 2018-07-31 37626415&flutter#43;[email protected] Roll src/third_party/skia 74c6ed3d1f17..1935aa3d27cd (11 commits) (flutter#5911) 2018-07-31 [email protected] Deprecate -[FlutterDartProject initFromDefaultSourceForConfiguration] (flutter#18886) (flutter#5858) 2018-07-31 37626415&flutter#43;[email protected] Roll src/third_party/skia 0bf5408286ea..74c6ed3d1f17 (1 commits) (flutter#5910) 2018-07-30 37626415&flutter#43;[email protected] Roll src/third_party/skia 946a162a5239..0bf5408286ea (1 commits) (flutter#5909) 2018-07-30 [email protected] Add word movement granularities to android (flutter#5902) 2018-07-30 37626415&flutter#43;[email protected] Roll src/third_party/skia f7dcd76c552a..946a162a5239 (3 commits) (flutter#5908) 2018-07-30 [email protected] Remove the &flutter#34;VSYNC&flutter#34; trace event on Fuchsia (flutter#5907) 2018-07-30 37626415&flutter#43;[email protected] Roll src/third_party/skia 62501c12c83e..f7dcd76c552a (5 commits) (flutter#5906) 2018-07-30 [email protected] Replace travis with cirrus (flutter#5899) 2018-07-30 [email protected] Use container and GKE to accelerate build (flutter#5897) 2018-07-30 [email protected] Add docker container generation scripts (flutter#5898) 2018-07-30 37626415&flutter#43;[email protected] Roll src/third_party/skia c06b8a4e0ca3..62501c12c83e (11 commits) (flutter#5905) 2018-07-30 [email protected] Clear the EGL context only if our context is currently active (flutter#5895) 2018-07-30 [email protected] Return proper JSON-RPC error responses from service protocol failures (flutter#5889) 2018-07-30 37626415&flutter#43;[email protected] Roll src/third_party/skia 227424b57d28..c06b8a4e0ca3 (22 commits) (flutter#5904) The AutoRoll server is located here: http://localhost:8000 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+/master/autoroll/README.md If the roll is causing failures, please contact the current sheriff, who should be CC&flutter#39;d on the roll, and stop the roller if necessary.

This requires all AnimationController objects to be given a
TickerProvider, a class that can create the Ticker.
It also provides some nice mixins for people who want to have their
State provide a TickerProvider. And a schedulerTickerProvider for those
cases where you just want to see your battery burn.
Also, we now enforce destruction order for elements.