Why a separate widget?

This is actually up to you how you want to manage the AnimationController. You can also define it in the specific widget that you are using (granted you call forward in initState and dispose). I usually prefer utilizing how small classes in Flutter are and writing multiple classes in the same file if I see the need. For example, in this case, we don't have to manage anything that has to do with the AnimationController in the actual screen but instead, just scroll up and handle it in a "locked" environment which is a lot more scalable when you start to handle multiple AnimationControllers.

SingleTickerProviderStateMixin & TickerProviderStateMixin

If you haven't heard these before, you will probably never forget them. This makes it possible for the animation to "tick". If you are only using a single AnimationController you would use the SingleTickerProviderStateMixin and if you use multiple AnimationControllers you would use the TickerProviderStateMixin.