{"id":71825,"date":"2019-10-15T04:19:02","date_gmt":"2019-10-15T11:19:02","guid":{"rendered":""},"modified":"2019-10-15T04:19:02","modified_gmt":"2019-10-15T11:19:02","slug":"animating-apps-with-flutter","status":"publish","type":"post","link":"https:\/\/www.taterboy.com\/blog\/2019\/10\/animating-apps-with-flutter\/","title":{"rendered":"Animating Apps With Flutter"},"content":{"rendered":"<link rel=\"canonical\" href=\"https:\/\/www.smashingmagazine.com\/2019\/10\/animation-apps-flutter\/\"><title>Animating Apps With Flutter<\/title><\/p>\n<article>\n<header>\n<h1>Animating Apps With Flutter<\/h1>\n<address>Shubham<\/address>\n<p>                  <time datetime=\"2019-10-14T13:30:59+02:00\">2019-10-14T13:30:59+02:00<\/time><time datetime=\"2019-10-15T11:06:33+00:00\">2019-10-15T11:06:33+00:00<\/time><\/header>\n<p>Apps for any platform are praised when they are intuitive, good-looking, and provide pleasant feedback to user interactions. Animation is one of the ways to do just that.<\/p>\n<p>Flutter, a cross-platform framework, has matured in the past two years to include web and desktop support. It has garnered a reputation that apps developed with it are smooth and good-looking. With its rich animation support, declarative way of writing UI, \u201cHot Reload,\u201d and other features, it is now a complete cross-platform framework.<\/p>\n<p>If you are starting out with Flutter and want to learn an unconventional way of adding animation, then you are at the right place: we will explore the realm of animation and motion widgets, an implicit way of adding animations.<\/p>\n<p>Flutter is based on the concept of widgets. Each visual component of an app is a widget \u2014 think of them as views in Android. Flutter provides animation support using an Animation class, an \u201cAnimationController\u201d object for management, and \u201cTween\u201d to interpolate the range of data. These three components work together to provide smooth animation. Since this requires manual creation and management of animation, it is known as an explicit way of animating.<\/p>\n<p>Now let me introduce you to animation and motion widgets. Flutter provides numerous widgets which inherently support animation. There\u2019s no need to create an animation object or any controller, as all the animation is handled by this category of widgets. Just choose the appropriate widget for the required animation and pass in the widget\u2019s properties values to animate. This technique is an implicit way of animating.<\/p>\n<figure><a href=\"https:\/\/i0.wp.com\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/a5ff46b9-aa12-4268-87c7-6907471b0ef1\/flutter-animation-hierarchy.png?ssl=1\"><\/p>\n<p>    <img data-recalc-dims=\"1\" decoding=\"async\" srcset=\"http:\/\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/flutter-animation-hierarchy.png 400w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_800\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/a5ff46b9-aa12-4268-87c7-6907471b0ef1\/flutter-animation-hierarchy.png 800w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1200\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/a5ff46b9-aa12-4268-87c7-6907471b0ef1\/flutter-animation-hierarchy.png 1200w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1600\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/a5ff46b9-aa12-4268-87c7-6907471b0ef1\/flutter-animation-hierarchy.png 1600w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_2000\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/a5ff46b9-aa12-4268-87c7-6907471b0ef1\/flutter-animation-hierarchy.png 2000w\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/flutter-animation-hierarchy.png?w=900\" sizes=\"100vw\" alt=\"\"><\/a><figcaption>\n      Animation hierarchy in Flutter. (<a href=\"https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/a5ff46b9-aa12-4268-87c7-6907471b0ef1\/flutter-animation-hierarchy.png\">Large preview<\/a>)<br \/>\n    <\/figcaption><\/figure>\n<p>The chart above roughly sets out the animation hierarchy in Flutter, how both explicit and implicit animation are supported.<\/p>\n<p>Some of the animated widgets covered in this article are:<\/p>\n<ul>\n<li><code>AnimatedOpacity<\/code><\/li>\n<li><code>AnimatedCrossFade<\/code><\/li>\n<li><code>AnimatedAlign<\/code><\/li>\n<li><code>AnimatedPadding<\/code><\/li>\n<li><code>AnimatedSize<\/code><\/li>\n<li><code>AnimatedPositioned<\/code>.<\/li>\n<\/ul>\n<p>Flutter not only provides predefined animated widgets but also a generic widget called <code>AnimatedWidget<\/code>, which can be used to create custom implicitly animated widgets. As evident from the name, these widgets belong to the animated and motion widgets category, and so they have some common properties which allow us to make animations much smoother and better looking.<\/p>\n<p>Let me explain these common properties now, as they will be used later in all examples.<\/p>\n<ul>\n<li><code>duration<\/code><br \/>\nThe duration over which to animate the parameters.<\/li>\n<li><code>reverseDuration<\/code><br \/>\nThe duration of the reverse animation.<\/li>\n<li><code>curve<\/code><br \/>\nThe curve to apply when animating the parameters. The interpolated values can be taken from a linear distribution or, if and when specified, can be taken from a curve.<\/li>\n<\/ul>\n<p>Let\u2019s begin the journey by creating a simple app we\u2019ll call \u201cQuoted\u201d. It will display a random quotation every time the app starts. Two things to note: first, all these quotations will be hardcoded in the application; and second, no user data will be saved.<\/p>\n<p><strong>Note<\/strong>: <em>All of <a href=\"https:\/\/github.com\/dev4fun007\/animated_widgets\">the files for these examples<\/a> can be found on GitHub.<\/em><\/p>\n<div data-component=\"FeaturePanel\" data-audience=\"non-subscriber\" data-remove=\"true\"><\/div>\n<h3>Getting Started<\/h3>\n<p>Flutter should be installed and you\u2019ll need some familiarity with the basic flow before moving on. A good place to start is, \u201c<a href=\"https:\/\/www.smashingmagazine.com\/2018\/06\/google-flutter-mobile-development\/\">Using Google\u2019s Flutter For Truly Cross-Platform Mobile Development<\/a>\u201d.<\/p>\n<p>Create a new Flutter project in Android Studio.<\/p>\n<figure><a href=\"https:\/\/i0.wp.com\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/2fa76395-f624-446c-b71f-d6b6b6a316a7\/new-flutter-project.png?ssl=1\"><\/p>\n<p>    <img data-recalc-dims=\"1\" decoding=\"async\" srcset=\"http:\/\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/new-flutter-project.png 400w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_800\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/2fa76395-f624-446c-b71f-d6b6b6a316a7\/new-flutter-project.png 800w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1200\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/2fa76395-f624-446c-b71f-d6b6b6a316a7\/new-flutter-project.png 1200w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1600\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/2fa76395-f624-446c-b71f-d6b6b6a316a7\/new-flutter-project.png 1600w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_2000\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/2fa76395-f624-446c-b71f-d6b6b6a316a7\/new-flutter-project.png 2000w\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/new-flutter-project.png?w=900\" sizes=\"100vw\" alt=\"\"><\/a><figcaption>\n      New flutter project menu in Android Studio. (<a href=\"https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/2fa76395-f624-446c-b71f-d6b6b6a316a7\/new-flutter-project.png\">Large preview<\/a>)<br \/>\n    <\/figcaption><\/figure>\n<p>This will open a new project wizard, where you can configure the project basics.<\/p>\n<figure><a href=\"https:\/\/i0.wp.com\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/0d758e94-0f21-4720-807b-80ea9ae4397f\/select-flutter-application.png?ssl=1\"><\/p>\n<p>    <img data-recalc-dims=\"1\" decoding=\"async\" srcset=\"http:\/\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/select-flutter-application.png 400w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_800\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/0d758e94-0f21-4720-807b-80ea9ae4397f\/select-flutter-application.png 800w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1200\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/0d758e94-0f21-4720-807b-80ea9ae4397f\/select-flutter-application.png 1200w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1600\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/0d758e94-0f21-4720-807b-80ea9ae4397f\/select-flutter-application.png 1600w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_2000\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/0d758e94-0f21-4720-807b-80ea9ae4397f\/select-flutter-application.png 2000w\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/select-flutter-application.png?w=900\" sizes=\"100vw\" alt=\"\"><\/a><figcaption>\n      Flutter project type selection screen. (<a href=\"https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/0d758e94-0f21-4720-807b-80ea9ae4397f\/select-flutter-application.png\">Large preview<\/a>)<br \/>\n    <\/figcaption><\/figure>\n<p>In the project type selection screen, there are various types of Flutter projects, each catering to a specific scenario.. For this tutorial, choose <strong>Flutter Application<\/strong> and press <strong>Next<\/strong>.<\/p>\n<p>You now need to enter some project-specific information: the project name and path, company domain, and so on. Have a look at the image below.<\/p>\n<figure><a href=\"https:\/\/i0.wp.com\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/54a602fa-8b0c-4e47-aac1-a68536549497\/flutter-app-project-name.png?ssl=1\"><\/p>\n<p>    <img data-recalc-dims=\"1\" decoding=\"async\" srcset=\"http:\/\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/flutter-app-project-name.png 400w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_800\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/54a602fa-8b0c-4e47-aac1-a68536549497\/flutter-app-project-name.png 800w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1200\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/54a602fa-8b0c-4e47-aac1-a68536549497\/flutter-app-project-name.png 1200w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1600\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/54a602fa-8b0c-4e47-aac1-a68536549497\/flutter-app-project-name.png 1600w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_2000\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/54a602fa-8b0c-4e47-aac1-a68536549497\/flutter-app-project-name.png 2000w\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/flutter-app-project-name.png?w=900\" sizes=\"100vw\" alt=\"\"><\/a><figcaption>\n      Flutter application configuration screen. (<a href=\"https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/54a602fa-8b0c-4e47-aac1-a68536549497\/flutter-app-project-name.png\">Large preview<\/a>)<br \/>\n    <\/figcaption><\/figure>\n<p>Add the project name, the Flutter SDK path, project location, and an optional project description. Press <strong>Next<\/strong>.<\/p>\n<figure><a href=\"https:\/\/i0.wp.com\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/3184587d-3aef-4e29-8fd9-ad30e8a56dce\/flutter-app-company-name.png?ssl=1\"><\/p>\n<p>    <img data-recalc-dims=\"1\" decoding=\"async\" srcset=\"http:\/\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/flutter-app-company-name.png 400w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_800\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/3184587d-3aef-4e29-8fd9-ad30e8a56dce\/flutter-app-company-name.png 800w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1200\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/3184587d-3aef-4e29-8fd9-ad30e8a56dce\/flutter-app-company-name.png 1200w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1600\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/3184587d-3aef-4e29-8fd9-ad30e8a56dce\/flutter-app-company-name.png 1600w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_2000\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/3184587d-3aef-4e29-8fd9-ad30e8a56dce\/flutter-app-company-name.png 2000w\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/flutter-app-company-name.png?w=900\" sizes=\"100vw\" alt=\"\"><\/a><figcaption>\n      Flutter application package name screen. (<a href=\"https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/3184587d-3aef-4e29-8fd9-ad30e8a56dce\/flutter-app-company-name.png\">Large preview<\/a>)<br \/>\n    <\/figcaption><\/figure>\n<p>Each application (be it Android or iOS) requires a unique package name. Typically, you use the reverse of your website domain; for example, com.google or com.yahoo. Press <strong>Finish<\/strong> to generate a working Flutter application.<\/p>\n<figure><a href=\"https:\/\/i0.wp.com\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/aaa40006-be80-4995-bebd-b1fc4c016e1a\/open-main-dart-file.png?ssl=1\"><\/p>\n<p>    <img data-recalc-dims=\"1\" decoding=\"async\" srcset=\"http:\/\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/open-main-dart-file.png 400w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_800\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/aaa40006-be80-4995-bebd-b1fc4c016e1a\/open-main-dart-file.png 800w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1200\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/aaa40006-be80-4995-bebd-b1fc4c016e1a\/open-main-dart-file.png 1200w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1600\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/aaa40006-be80-4995-bebd-b1fc4c016e1a\/open-main-dart-file.png 1600w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_2000\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/aaa40006-be80-4995-bebd-b1fc4c016e1a\/open-main-dart-file.png 2000w\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/open-main-dart-file.png?w=900\" sizes=\"100vw\" alt=\"\"><\/a><figcaption>\n      The generated sample project. (<a href=\"https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/aaa40006-be80-4995-bebd-b1fc4c016e1a\/open-main-dart-file.png\">Large preview<\/a>)<br \/>\n    <\/figcaption><\/figure>\n<p>Once the project is generated, you should see the screen shown above. Open the <em>main.dart<\/em> file (highlighted in the screenshot). This is the main application file. The sample project is complete in itself, and can be run directly on an emulator or a physical device without any modification.<\/p>\n<div><\/div>\n<p>Replace the content of the <em>main.dart<\/em> file with the following code snippet:<\/p>\n<pre><code>import 'package:animated_widgets\/FirstPage.dart';\nimport 'package:flutter\/material.dart';\n\nvoid main() => runApp(MyApp());\nclass MyApp extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n   return MaterialApp(\n     title: 'Animated Widgets',\n     debugShowCheckedModeBanner: false,\n     theme: ThemeData(\n       primarySwatch: Colors.blue,\n       accentColor: Colors.redAccent,\n     ),\n     home: FirstPage(),\n   );\n }\n}<\/code><\/pre>\n<p>This code cleans up the <em>main.dart<\/em> file by just adding simple information relevant to creating a new app. The class MyApp returns an object: a <code>MaterialApp<\/code> widget, which provides the basic structure for creating apps conforming to <a href=\"https:\/\/material.io\/design\/\">Material Design<\/a>. To make the code more structured, create two new dart files inside the <em>lib<\/em> folder: <em>FirstPage.dart<\/em> and <em>Quotes.dart<\/em>.<\/p>\n<figure><a href=\"https:\/\/i0.wp.com\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/6152a6b4-f5d3-488c-8fd1-eb5fc14139b2\/first-page-dart.png?ssl=1\"><\/p>\n<p>    <img data-recalc-dims=\"1\" decoding=\"async\" srcset=\"http:\/\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/first-page-dart.png 400w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_800\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/6152a6b4-f5d3-488c-8fd1-eb5fc14139b2\/first-page-dart.png 800w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1200\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/6152a6b4-f5d3-488c-8fd1-eb5fc14139b2\/first-page-dart.png 1200w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1600\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/6152a6b4-f5d3-488c-8fd1-eb5fc14139b2\/first-page-dart.png 1600w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_2000\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/6152a6b4-f5d3-488c-8fd1-eb5fc14139b2\/first-page-dart.png 2000w\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/first-page-dart.png?w=900\" sizes=\"100vw\" alt=\"\"><\/a><figcaption>\n      The FirstPage.dart file. (<a href=\"https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/6152a6b4-f5d3-488c-8fd1-eb5fc14139b2\/first-page-dart.png\">Large preview<\/a>)<br \/>\n    <\/figcaption><\/figure>\n<p><em>FirstPage.dart<\/em> will contain all the code responsible for all the visual elements (widgets) required for our Quoted app. All the animation is handled in this file.<\/p>\n<p><strong>Note<\/strong>: <em>Later in the article, all of the code snippets for each animated widget are added to this file as children of the Scaffold widget. For more information, <a href=\"https:\/\/github.com\/dev4fun007\/animated_widgets\">This example on GitHub<\/a> could be useful.<\/em><\/p>\n<p>Start by adding the following code to <em>FirstPage.dart<\/em>. This is the partial code where other stuff will be added later.<\/p>\n<div>\n<pre><code>import 'dart:math';\n\nimport 'package:animated_widgets\/Quotes.dart';\nimport 'package:flutter\/material.dart';\n\n\nclass FirstPage extends StatefulWidget {\n @override\n State<statefulwidget> createState() {\n   return FirstPageState();\n }\n}\n\nclass FirstPageState extends State<firstpage> with TickerProviderStateMixin {\n\n bool showNextButton = false;\n bool showNameLabel = false;\n bool alignTop = false;\n bool increaseLeftPadding = false;\n bool showGreetings = false;\n bool showQuoteCard = false;\n String name = '';\n\n\n double screenWidth;\n double screenHeight;\n String quote;\n\n\n @override\n void initState() {\n   super.initState();\n   Random random = new Random();\n   int quoteIndex = random.nextInt(Quotes.quotesArray.length);\n   quote = Quotes.quotesArray[quoteIndex];\n }\n\n @override\n Widget build(BuildContext context) {\n\n   screenWidth = MediaQuery.of(context).size.width;\n   screenHeight = MediaQuery.of(context).size.height;\n\n   return Scaffold(\n     appBar: _getAppBar(),\n     body: Stack(\n       children: <widget>[\n         \/\/ All other children will be added here.\n      \/\/ In this article, all the children widgets are contained\n      \/\/ in their own separate methods.\n      \/\/ Just method calls should be added here for the respective child.\n       ],\n     ),\n   );\n }\n}<\/widget><\/firstpage><\/statefulwidget><\/code><\/pre>\n<\/div>\n<figure><a href=\"https:\/\/i0.wp.com\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/2b12bf2a-b80f-4cfc-b05b-a907ef130e2e\/quotes-file.png?ssl=1\"><\/p>\n<p>    <img data-recalc-dims=\"1\" decoding=\"async\" srcset=\"http:\/\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/quotes-file.png 400w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_800\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/2b12bf2a-b80f-4cfc-b05b-a907ef130e2e\/quotes-file.png 800w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1200\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/2b12bf2a-b80f-4cfc-b05b-a907ef130e2e\/quotes-file.png 1200w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1600\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/2b12bf2a-b80f-4cfc-b05b-a907ef130e2e\/quotes-file.png 1600w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_2000\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/2b12bf2a-b80f-4cfc-b05b-a907ef130e2e\/quotes-file.png 2000w\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/quotes-file.png?w=900\" sizes=\"100vw\" alt=\"\"><\/a><figcaption>\n      The Quotes.dart file. (<a href=\"https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/2b12bf2a-b80f-4cfc-b05b-a907ef130e2e\/quotes-file.png\">Large preview<\/a>)<br \/>\n    <\/figcaption><\/figure>\n<p>The <em>Quotes.dart<\/em> file contains a list of all the hardcoded quotations. One point to note here is that the list is a static object. This means it can be used at other places without creating a new object of the Quotes class. This is chosen by design, as the above list act simply as a utility.<\/p>\n<p>Add the following code to this file:<\/p>\n<div>\n<pre><code>class Quotes {\n static const quotesArray = [\n   \"Good, better, best. Never let it rest. 'Til your good is better and your better is best\",\n   \"It does not matter how slowly you go as long as you do not stop.\",\n   \"Only I can change my life. No one can do it for me.\"\n ];\n}<\/code><\/pre>\n<\/div>\n<p>The project skeleton is now ready, so let\u2019s flesh out Quoted a bit more.<\/p>\n<h3><code>AnimatedOpacity<\/code><\/h3>\n<p>To lend a personal touch to the app, it would be nice to know the user\u2019s name, so let\u2019s ask for it and show a next button. Until the user enters their name, this button is hidden, and it will gracefully show up when a name is given. We need some kind of visibility animation for the button, but is there a widget for that? Yes, there is.<\/p>\n<p>Enter <code>AnimatedOpacity<\/code>. This widget builds on the Opacity widget by adding implicit animation support. How do we use it? Remember our scenario: we need to show a next button with animated visibility. We wrap the button widget inside the <code>AnimatedOpacity<\/code> widget, feed in some proper values and add a condition to trigger the animation \u2014 and Flutter can handle the rest.<\/p>\n<pre><code>_getAnimatedOpacityButton() {\n  return AnimatedOpacity(\n    duration: Duration(seconds: 1),\n    reverseDuration: Duration(seconds: 1),\n    curve: Curves.easeInOut,\n    opacity: showNextButton ? 1 : 0,\n    child: _getButton(),\n  );\n}<\/code><\/pre>\n<figure><a href=\"https:\/\/i0.wp.com\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/000143f0-0f6f-4f77-9a61-4450568cebcd\/animatedopacity.gif?ssl=1\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/animated-opacity-400w.gif?w=400\"   alt=\"\"><\/a><figcaption>Opacity animation of next button. (<a href=\"https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/000143f0-0f6f-4f77-9a61-4450568cebcd\/animatedopacity.gif\">Large preview<\/a>)<\/figcaption><\/figure>\n<p>The <code>AnimatedOpacity<\/code> widget has two mandatory properties:<\/p>\n<ul>\n<li><code>opacity<\/code><br \/>\nA value of 1 means completely visible; 0 (zero) means hidden. While animating, Flutter interpolates values between these two extremes. You can see how a condition is placed to change the visibility, thus triggering animation.<\/li>\n<li><code>child<\/code><br \/>\nThe child widget that will have its visibility animated.<\/li>\n<\/ul>\n<p>You should now understand how really simple it is to add visibility animation with the implicit widget. And all such widgets follow the same guidelines and are easy to use. Let\u2019s move on to the next one.<\/p>\n<div><\/div>\n<h3><code>AnimatedCrossFade<\/code><\/h3>\n<p>We have the user\u2019s name, but the widget is still waiting for input. In the previous step, as the user enters their name, we display the next button. Now, when the user presses the button, I want to stop accepting input and show the entered name. There are many ways to do it, of course, but perhaps we can hide away the input widget and show an uneditable text widget. Let\u2019s try it out using the <code>AnimatedCrossFade<\/code> widget.<\/p>\n<p>This widget requires two children, as the widget crossfades between them based on some condition. One important thing to keep in mind while using this widget is that both of the children should be the same width. If the height is different, then the taller widget gets clipped from the bottom. In this scenario, two widgets will be used as children: input and label.<\/p>\n<div>\n<pre><code>_getAnimatedCrossfade() {\n\n  return AnimatedCrossFade(\n\n    duration: Duration(seconds: 1),\n\n    alignment: Alignment.center,\n\n    reverseDuration: Duration(seconds: 1),\n\n    firstChild: _getNameInputWidget(),\n\n    firstCurve: Curves.easeInOut,\n\n    secondChild: _getNameLabelWidget(),\n\n    secondCurve: Curves.easeInOut,\n\n    crossFadeState: showNameLabel ? CrossFadeState.showSecond : CrossFadeState.showFirst,\n\n  );\n\n}<\/code><\/pre>\n<\/div>\n<figure><a href=\"https:\/\/i0.wp.com\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/8bde61ba-34fe-414f-9905-552e2e96d002\/animatedcrossfade.gif?ssl=1\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/animated-crossfade-400w.gif?w=400\"   alt=\"\"><\/a><figcaption>Cross-fading between the input widget and name widget. (<a href=\"https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/8bde61ba-34fe-414f-9905-552e2e96d002\/animatedcrossfade.gif\">Large preview<\/a>)<\/figcaption><\/figure>\n<p>This widget requires a different set of mandatory parameters:<\/p>\n<ul>\n<li><code>crossFadeState<\/code><br \/>\nThis state works out which child to show.<\/li>\n<li><code>firstChild<\/code><br \/>\nSpecifies the first child for this widget.<\/li>\n<li><code>secondChild<\/code><br \/>\nSpecifies the second child.<\/li>\n<\/ul>\n<h3><code>AnimatedAlign<\/code><\/h3>\n<p>At this point, the name label is positioned at the center of the screen. It will look much better at the top, as we need the center of the screen to show quotes. Simply put, the alignment of the name label widget should be changed from center to top. And wouldn\u2019t it be nice to animate this alignment change along with the previous cross-fade animation? Let\u2019s do it.<\/p>\n<p>As always, several techniques can be used to achieve this. Since the name label widget is already center-aligned, animating its alignment would be much simpler than manipulating the top and left values of the widget. The <code>AnimatedAlign<\/code> widget is perfect for this job.<\/p>\n<p>To initiate this animation, a trigger is required. The sole purpose of this widget is to animate alignment change, so it has only a few properties: add a child, set its alignment, trigger the alignment change, and that\u2019s it.<\/p>\n<pre><code>_getAnimatedAlignWidget() {\n\n  return AnimatedAlign(\n\nduration: Duration(seconds: 1),\n\ncurve: Curves.easeInOut,\n\nalignment: alignTop ? Alignment.topLeft : Alignment.center,\n\nchild: _getAnimatedCrossfade(),\n\n  );\n\n}<\/code><\/pre>\n<figure><a href=\"https:\/\/i0.wp.com\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/b95e3d10-e95e-4f2d-9bce-b5dde562c22e\/animatedalign.gif?ssl=1\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/animated-align-400w.gif?w=400\"   alt=\"\"><\/a><figcaption> Alignment animation of the name widget. (<a href=\"https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/b95e3d10-e95e-4f2d-9bce-b5dde562c22e\/animatedalign.gif\">Large preview<\/a>)<\/figcaption><\/figure>\n<p>It has only two mandatory properties:<\/p>\n<ul>\n<li><strong>child:<\/strong><br \/>The child whose alignment will be modified.<\/li>\n<li><strong>alignment:<\/strong><br \/>Required alignment value.<\/li>\n<\/ul>\n<p>This widget is really simple but the results are elegant. Moreover, we saw how easily we can use two different animated widgets to create a more complex animation. This is the beauty of animated widgets.<\/p>\n<h3><code>AnimatedPadding<\/code><\/h3>\n<p>Now we have the user\u2019s name at the top, smoothly animated without much effort, using different kinds of animated widgets. Let\u2019s add a greeting, \u201cHi,\u201d before the name. Adding a text widget with value \u201cHi,\u201d at the top will make it overlap the greeting text widget, looking like the image below.<\/p>\n<figure><a href=\"https:\/\/i0.wp.com\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/487115cd-a1fc-4e31-9bb7-3738f9487c89\/name-greetings-overlap.png?ssl=1\"><\/p>\n<p>    <img data-recalc-dims=\"1\" decoding=\"async\" srcset=\"http:\/\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/name-greetings-overlap.png 400w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_800\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/487115cd-a1fc-4e31-9bb7-3738f9487c89\/name-greetings-overlap.png 800w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1200\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/487115cd-a1fc-4e31-9bb7-3738f9487c89\/name-greetings-overlap.png 1200w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_1600\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/487115cd-a1fc-4e31-9bb7-3738f9487c89\/name-greetings-overlap.png 1600w,\n\t\t\t        https:\/\/res.cloudinary.com\/indysigner\/image\/fetch\/f_auto,q_auto\/w_2000\/https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/487115cd-a1fc-4e31-9bb7-3738f9487c89\/name-greetings-overlap.png 2000w\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/name-greetings-overlap.png?w=900\" sizes=\"100vw\" alt=\"\"><\/a><figcaption>\n      The greeting and name widgets overlap. (<a href=\"https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/487115cd-a1fc-4e31-9bb7-3738f9487c89\/name-greetings-overlap.png\">Large preview<\/a>)<br \/>\n    <\/figcaption><\/figure>\n<p>What if the name text widget had some padding on the left? Increasing the left padding will definitely work, but wait: can we increase the padding with some animation? Yes, and that is what <code>AnimatedPadding<\/code> does. To make all this much better looking, let\u2019s have the greetings text widget fade in and the name text widget\u2019s padding increase at the same time.<\/p>\n<div>\n<pre><code>_getAnimatedPaddingWidget() {\n\n  return AnimatedPadding(\n\n    duration: Duration(seconds: 1),\n\n    curve: Curves.fastOutSlowIn,\n\n    padding: increaseLeftPadding ? EdgeInsets.only(left: 28.0) : EdgeInsets.only(left: 0),\n\n    child: _getAnimatedCrossfade(),\n\n  );\n\n}<\/code><\/pre>\n<\/div>\n<p>Since the animation above should occur only after the previous animated alignment is complete, we need to delay triggering this animation. Digressing from the topic briefly, this is a good moment to talk about a popular mechanism to add delay. Flutter provides several such techniques, but the Future.delayed constructor is one of the simpler, cleaner and more readable approaches. For instance, to execute a piece of code after 1 second:<\/p>\n<div>\n<pre><code>Future.delayed(Duration(seconds: 1), (){\n    sum = a + b;    \/\/ This sum will be calculated after 1 second.\n    print(sum);\n});<\/code><\/pre>\n<\/div>\n<p>Since the delay duration is already known (calculated from previous animation durations), the animation can be triggered after this interval.<\/p>\n<div>\n<pre><code>\/\/ Showing \u201cHi\u201d after 1 second - greetings visibility trigger.\n_showGreetings() {\n  Future.delayed(Duration(seconds: 1), () {\n    setState(() {\n        showGreetings = true;\n    });\n  });\n}\n\n\/\/ Increasing the padding for name label widget after 1 second - increase padding trigger.\n_increaseLeftPadding() {\n  Future.delayed(Duration(seconds: 1), () {\n    setState(() {\n    increaseLeftPadding = true;\n    });\n  });\n}<\/code><\/pre>\n<\/div>\n<figure><a href=\"https:\/\/i0.wp.com\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/309333bd-518f-4802-b4bb-20d61bc143b3\/animatedpadding.gif?ssl=1\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/animated-padding-400w.gif?w=400\"   alt=\"\"><\/a><figcaption>Padding animation of the name widget. (<a href=\"https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/309333bd-518f-4802-b4bb-20d61bc143b3\/animatedpadding.gif\">Large preview<\/a>)<\/figcaption><\/figure>\n<p>This widget has only two mandatory properties:<\/p>\n<ul>\n<li><code>child<\/code><br \/>\nThe child inside this widget, which padding will be applied to.<\/li>\n<li><code>padding<\/code><br \/>\nThe amount of space to add.<\/li>\n<\/ul>\n<h3><code>AnimatedSize<\/code><\/h3>\n<p>Today, any app having some kind of animation will include zooming in to or out of visual components to grab user attention (commonly called scaling animation). Why not use the same technique here? We can show the user a motivational quote that zooms in from the center of the screen. Let me introduce you to the <code>AnimatedSize<\/code> widget, which enables the zoom-in and zoom-out effects, controlled by changing the size of its child.<\/p>\n<p>This widget is a bit different from the others when it comes to the required parameters. We need what Flutter calls a \u201cTicker.\u201d Flutter has a method to let objects know whenever a new frame event is triggered. It can be thought of as something that sends a signal saying, \u201cDo it now! \u2026 Do it now! \u2026 Do it now! \u2026\u201d<\/p>\n<p>The <code>AnimatedSize<\/code> widget requires a property \u2014 <strong>vsync<\/strong> \u2014 which accepts a ticker provider. The easiest way to get a ticker provider is to add a <strong>Mixin<\/strong> to the class. There are two basic ticker provider implementations: <code>SingleTickerProviderStateMixin<\/code>, which provides a single ticker; and <code>TickerProviderStateMixin<\/code>, which provides several.<\/p>\n<p>The default implementation of a Ticker is used to mark the frames of an animation. In this case, the latter is employed. More about <a href=\"https:\/\/dart.dev\/guides\/language\/language-tour#adding-features-to-a-class-mixins\">mixins<\/a>.<\/p>\n<div>\n<pre><code>\/\/ Helper method to create quotes card widget.\n_getQuoteCardWidget() {\n  return Card(\n    color: Colors.green,\n    elevation: 8.0,\n    child: _getAnimatedSizeWidget(),\n  );\n}\n\/\/ Helper method to create animated size widget and set its properties.\n_getAnimatedSizeWidget() {\n  return AnimatedSize(\n    duration: Duration(seconds: 1),\n    curve: Curves.easeInOut,\n    vsync: this,\n    child: _getQuoteContainer(),\n  );\n}\n\/\/ Helper method to create the quotes container widget with different sizes.\n_getQuoteContainer() {\n  return Container(\n    height: showQuoteCard ? 100 : 0,\n    width: showQuoteCard ? screenWidth - 32 : 0,\n    child: Center(\n    child: Padding(\n        padding: EdgeInsets.symmetric(horizontal: 16),\n        child: Text(quote, style: TextStyle(color: Colors.white, fontWeight: FontWeight.w400, fontSize: 14),),\n    ),\n    ),\n  );\n}\n\/\/ Trigger used to show the quote card widget.\n_showQuote() {\n  Future.delayed(Duration(seconds: 2), () {\n    setState(() {\n        showQuoteCard = true;\n    });\n  });\n}<\/code><\/pre>\n<\/div>\n<figure><a href=\"https:\/\/i0.wp.com\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/25d65198-cee7-4b75-827d-662241452484\/animatedsize.gif?ssl=1\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/animated-size-400w.gif?w=400\"   alt=\"\"><\/a><figcaption>Scaling animation of the quotes widget. (<a href=\"https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/25d65198-cee7-4b75-827d-662241452484\/animatedsize.gif\">Large preview<\/a>)<\/figcaption><\/figure>\n<p>Mandatory properties for this widget:<\/p>\n<ul>\n<li><code>vsync<\/code><br \/>\nThe required ticker provider to coordinate animation and frame changes.<<\/li>\n<li><code>child<\/code><br \/>\nThe child whose size changes will be animated.<\/li>\n<\/ul>\n<p>The zoom in and zoom out animation is now easily tamed.<\/p>\n<h3><code>AnimatedPositioned<\/code><\/h3>\n<p>Great! The quotes zoom in from the center to grab the user\u2019s attention. What if it slid up from the bottom while zooming in? Let\u2019s try it. This motion involves playing with the position of the quote widget and animating the changes in position properties. <code>AnimatedPositioned<\/code> is the perfect candidate.<\/p>\n<p>This widget automatically transitions the child\u2019s position over a given duration whenever the specified position changes. One point to note: it works only if its parent widget is a \u201cStack.\u201d This widget is pretty simple and straightforward to use. Let\u2019s see.<\/p>\n<pre><code>\/\/ Helper method to create the animated positioned widget.\n\/\/ With position changes based on \u201cshowQuoteCard\u201d flag.\n_getAnimatedPositionWidget() {\n  return AnimatedPositioned(\n    duration: Duration(seconds: 1),\n    curve: Curves.easeInOut,\n    child: _getQuoteCardWidget(),\n    top: showQuoteCard ? screenHeight\/2 - 100 : screenHeight,\n    left: !showQuoteCard ? screenWidth\/2 : 12,\n  );\n}<\/code><\/pre>\n<figure><a href=\"https:\/\/i0.wp.com\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/48786ddc-3cc6-4178-9605-a1bd4b24da9f\/animatedpositioned.gif?ssl=1\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/animated-positioned-400w.gif?w=400\"   alt=\"\"><\/a><figcaption>Position with scaling animation of quotes. (<a href=\"https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/48786ddc-3cc6-4178-9605-a1bd4b24da9f\/animatedpositioned.gif\">Large preview<\/a>)<\/figcaption><\/figure>\n<p>This widget has only one mandatory property:<\/p>\n<ul>\n<li><code>child<\/code><br \/>\nThe widget whose position will be changed.<\/li>\n<\/ul>\n<p>If the size of the child is not expected to change along with its position, a more performative alternative to this widget would be <code>SlideTransition<\/code>.<\/p>\n<p>Here is our complete animation:<\/p>\n<figure><a href=\"https:\/\/i0.wp.com\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/f62bf735-f74f-4b58-8900-03ef3d23e108\/fullvideo-flutter-animation.gif?ssl=1\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/full-video-flutter-animation-400w.gif?w=400\"   alt=\"\"><\/a><figcaption>All the animated widgets together. (<a href=\"https:\/\/cloud.netlifyusercontent.com\/assets\/344dbf88-fdf9-42bb-adb4-46f01eedd629\/f62bf735-f74f-4b58-8900-03ef3d23e108\/fullvideo-flutter-animation.gif\">Large preview<\/a>)<\/figcaption><\/figure>\n<h3>Conclusion<\/h3>\n<p>Animations are an integral part of user experience. Static apps or apps with janky animation not only lower user retention but also a developer\u2019s reputation to deliver results.<\/p>\n<p>Today, most popular apps have some kind of subtle animation to delight users. Animated feedback to user requests can also engage them to explore more. Flutter offers a lot of features for cross-platform development, including rich support for smooth and responsive animations.<\/p>\n<p>Flutter has great plug-in support which allows us to use animations from other developers. Now that it has matured to version 1.9, with so much love from the community, Flutter is bound to get better in the future. I\u2019d say now is a great time to learn Flutter!<\/p>\n<h4>Further Resources<\/h4>\n<ul>\n<li>\u201c<a href=\"https:\/\/flutter.dev\/docs\/development\/ui\/widgets\/animation\">Animation And Motion Widgets<\/a>,\u201d Flutter Docs<\/li>\n<li>\u201c<a href=\"https:\/\/flutter.dev\/docs\/development\/ui\/animations\">Introduction To Animations<\/a>,\u201d Flutter Docs<\/li>\n<li><a href=\"https:\/\/flutter.dev\/docs\/codelabs\">Flutter Codelabs<\/a><\/li>\n<\/ul>\n<p><strong>Editor\u2019s Note<\/strong>: <em>A huge Thank You to <a href=\"https:\/\/twitter.com\/MrAhmadAwais\">Ahmad Awais<\/a> for his help in reviewing this article.<\/em><\/p>\n<div>\n  <img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/logo-red-10.png?w=900\" alt=\"Smashing Editorial\"><span>(dm, og, yk, il)<\/span>\n<\/div>\n<\/article>\n<p class=\"wpematico_credit\"><small>Powered by <a href=\"http:\/\/www.wpematico.com\" target=\"_blank\">WPeMatico<\/a><\/small><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Animating Apps With Flutter Animating Apps With Flutter Shubham 2019-10-14T13:30:59+02:002019-10-15T11:06:33+00:00 Apps for any platform are praised when they are intuitive, good-looking, and provide pleasant feedback to user interactions. Animation is one of the ways to do just that. Flutter, a cross-platform framework, has matured in the past two years to include web and desktop support&#8230;.<a class=\"moretag\" href=\"https:\/\/www.taterboy.com\/blog\/2019\/10\/animating-apps-with-flutter\/\"> Read the full article&#8230;<\/a><\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[15],"tags":[],"class_list":["post-71825","post","type-post","status-publish","format-standard","hentry","category-general-info"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Animating Apps With FlutterAnimating Apps With Flutter Shubham 2019-10-14T13:30:59+02:002019-10-15T11:06:33+00:00Apps for any platform are praised when they are intuitive, good-looking, and provide pleasant feedback to user interactions. Animation is one of the ways to do just that. Flutter, a cross-platform framework, has matured in the past two years to include web and desktop support. It has\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Guest Contribution\"\/>\n\t<meta name=\"keywords\" content=\"general info\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.taterboy.com\/blog\/2019\/10\/animating-apps-with-flutter\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Design for Immersive Technologies | User Experience for Games, Virtual Reality (VR) and Augmented\/Mixed Reality (AR\/MR)\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Animating Apps With Flutter | Design for Immersive Technologies\" \/>\n\t\t<meta property=\"og:description\" content=\"Animating Apps With FlutterAnimating Apps With Flutter Shubham 2019-10-14T13:30:59+02:002019-10-15T11:06:33+00:00Apps for any platform are praised when they are intuitive, good-looking, and provide pleasant feedback to user interactions. Animation is one of the ways to do just that. Flutter, a cross-platform framework, has matured in the past two years to include web and desktop support. It has\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.taterboy.com\/blog\/2019\/10\/animating-apps-with-flutter\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-15T11:19:02+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-15T11:19:02+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Animating Apps With Flutter | Design for Immersive Technologies\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Animating Apps With FlutterAnimating Apps With Flutter Shubham 2019-10-14T13:30:59+02:002019-10-15T11:06:33+00:00Apps for any platform are praised when they are intuitive, good-looking, and provide pleasant feedback to user interactions. Animation is one of the ways to do just that. Flutter, a cross-platform framework, has matured in the past two years to include web and desktop support. It has\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/10\\\/animating-apps-with-flutter\\\/#article\",\"name\":\"Animating Apps With Flutter | Design for Immersive Technologies\",\"headline\":\"Animating Apps With Flutter\",\"author\":{\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/author\\\/guestcontribution\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"http:\\\/\\\/www.taterboy.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/flutter-animation-hierarchy.png\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/10\\\/animating-apps-with-flutter\\\/#articleImage\"},\"datePublished\":\"2019-10-15T04:19:02-07:00\",\"dateModified\":\"2019-10-15T04:19:02-07:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/10\\\/animating-apps-with-flutter\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/10\\\/animating-apps-with-flutter\\\/#webpage\"},\"articleSection\":\"General Info\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/10\\\/animating-apps-with-flutter\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.taterboy.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/category\\\/general-info\\\/#listItem\",\"name\":\"General Info\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/category\\\/general-info\\\/#listItem\",\"position\":2,\"name\":\"General Info\",\"item\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/category\\\/general-info\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/10\\\/animating-apps-with-flutter\\\/#listItem\",\"name\":\"Animating Apps With Flutter\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/10\\\/animating-apps-with-flutter\\\/#listItem\",\"position\":3,\"name\":\"Animating Apps With Flutter\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/category\\\/general-info\\\/#listItem\",\"name\":\"General Info\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/#organization\",\"name\":\"Design for Immersive Technologies\",\"description\":\"User Experience for Games, Virtual Reality (VR) and Augmented\\\/Mixed Reality (AR\\\/MR)\",\"url\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/author\\\/guestcontribution\\\/#author\",\"url\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/author\\\/guestcontribution\\\/\",\"name\":\"Guest Contribution\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/10\\\/animating-apps-with-flutter\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d2aad73eb0f48c67b141e9fc978a0e498969791ed623346e361d02d19775b0bb?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Guest Contribution\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/10\\\/animating-apps-with-flutter\\\/#webpage\",\"url\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/10\\\/animating-apps-with-flutter\\\/\",\"name\":\"Animating Apps With Flutter | Design for Immersive Technologies\",\"description\":\"Animating Apps With FlutterAnimating Apps With Flutter Shubham 2019-10-14T13:30:59+02:002019-10-15T11:06:33+00:00Apps for any platform are praised when they are intuitive, good-looking, and provide pleasant feedback to user interactions. Animation is one of the ways to do just that. Flutter, a cross-platform framework, has matured in the past two years to include web and desktop support. It has\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/2019\\\/10\\\/animating-apps-with-flutter\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/author\\\/guestcontribution\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/author\\\/guestcontribution\\\/#author\"},\"datePublished\":\"2019-10-15T04:19:02-07:00\",\"dateModified\":\"2019-10-15T04:19:02-07:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/\",\"name\":\"Design for Immersive Technologies\",\"description\":\"User Experience for Games, Virtual Reality (VR) and Augmented\\\/Mixed Reality (AR\\\/MR)\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.taterboy.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Animating Apps With Flutter | Design for Immersive Technologies","description":"Animating Apps With FlutterAnimating Apps With Flutter Shubham 2019-10-14T13:30:59+02:002019-10-15T11:06:33+00:00Apps for any platform are praised when they are intuitive, good-looking, and provide pleasant feedback to user interactions. Animation is one of the ways to do just that. Flutter, a cross-platform framework, has matured in the past two years to include web and desktop support. It has","canonical_url":"https:\/\/www.taterboy.com\/blog\/2019\/10\/animating-apps-with-flutter\/","robots":"max-image-preview:large","keywords":"general info","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.taterboy.com\/blog\/2019\/10\/animating-apps-with-flutter\/#article","name":"Animating Apps With Flutter | Design for Immersive Technologies","headline":"Animating Apps With Flutter","author":{"@id":"https:\/\/www.taterboy.com\/blog\/author\/guestcontribution\/#author"},"publisher":{"@id":"https:\/\/www.taterboy.com\/blog\/#organization"},"image":{"@type":"ImageObject","url":"http:\/\/www.taterboy.com\/blog\/wp-content\/uploads\/2019\/10\/flutter-animation-hierarchy.png","@id":"https:\/\/www.taterboy.com\/blog\/2019\/10\/animating-apps-with-flutter\/#articleImage"},"datePublished":"2019-10-15T04:19:02-07:00","dateModified":"2019-10-15T04:19:02-07:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/www.taterboy.com\/blog\/2019\/10\/animating-apps-with-flutter\/#webpage"},"isPartOf":{"@id":"https:\/\/www.taterboy.com\/blog\/2019\/10\/animating-apps-with-flutter\/#webpage"},"articleSection":"General Info"},{"@type":"BreadcrumbList","@id":"https:\/\/www.taterboy.com\/blog\/2019\/10\/animating-apps-with-flutter\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.taterboy.com\/blog#listItem","position":1,"name":"Home","item":"https:\/\/www.taterboy.com\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/www.taterboy.com\/blog\/category\/general-info\/#listItem","name":"General Info"}},{"@type":"ListItem","@id":"https:\/\/www.taterboy.com\/blog\/category\/general-info\/#listItem","position":2,"name":"General Info","item":"https:\/\/www.taterboy.com\/blog\/category\/general-info\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.taterboy.com\/blog\/2019\/10\/animating-apps-with-flutter\/#listItem","name":"Animating Apps With Flutter"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.taterboy.com\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.taterboy.com\/blog\/2019\/10\/animating-apps-with-flutter\/#listItem","position":3,"name":"Animating Apps With Flutter","previousItem":{"@type":"ListItem","@id":"https:\/\/www.taterboy.com\/blog\/category\/general-info\/#listItem","name":"General Info"}}]},{"@type":"Organization","@id":"https:\/\/www.taterboy.com\/blog\/#organization","name":"Design for Immersive Technologies","description":"User Experience for Games, Virtual Reality (VR) and Augmented\/Mixed Reality (AR\/MR)","url":"https:\/\/www.taterboy.com\/blog\/"},{"@type":"Person","@id":"https:\/\/www.taterboy.com\/blog\/author\/guestcontribution\/#author","url":"https:\/\/www.taterboy.com\/blog\/author\/guestcontribution\/","name":"Guest Contribution","image":{"@type":"ImageObject","@id":"https:\/\/www.taterboy.com\/blog\/2019\/10\/animating-apps-with-flutter\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/d2aad73eb0f48c67b141e9fc978a0e498969791ed623346e361d02d19775b0bb?s=96&d=mm&r=g","width":96,"height":96,"caption":"Guest Contribution"}},{"@type":"WebPage","@id":"https:\/\/www.taterboy.com\/blog\/2019\/10\/animating-apps-with-flutter\/#webpage","url":"https:\/\/www.taterboy.com\/blog\/2019\/10\/animating-apps-with-flutter\/","name":"Animating Apps With Flutter | Design for Immersive Technologies","description":"Animating Apps With FlutterAnimating Apps With Flutter Shubham 2019-10-14T13:30:59+02:002019-10-15T11:06:33+00:00Apps for any platform are praised when they are intuitive, good-looking, and provide pleasant feedback to user interactions. Animation is one of the ways to do just that. Flutter, a cross-platform framework, has matured in the past two years to include web and desktop support. It has","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.taterboy.com\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/www.taterboy.com\/blog\/2019\/10\/animating-apps-with-flutter\/#breadcrumblist"},"author":{"@id":"https:\/\/www.taterboy.com\/blog\/author\/guestcontribution\/#author"},"creator":{"@id":"https:\/\/www.taterboy.com\/blog\/author\/guestcontribution\/#author"},"datePublished":"2019-10-15T04:19:02-07:00","dateModified":"2019-10-15T04:19:02-07:00"},{"@type":"WebSite","@id":"https:\/\/www.taterboy.com\/blog\/#website","url":"https:\/\/www.taterboy.com\/blog\/","name":"Design for Immersive Technologies","description":"User Experience for Games, Virtual Reality (VR) and Augmented\/Mixed Reality (AR\/MR)","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.taterboy.com\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Design for Immersive Technologies | User Experience for Games, Virtual Reality (VR) and Augmented\/Mixed Reality (AR\/MR)","og:type":"article","og:title":"Animating Apps With Flutter | Design for Immersive Technologies","og:description":"Animating Apps With FlutterAnimating Apps With Flutter Shubham 2019-10-14T13:30:59+02:002019-10-15T11:06:33+00:00Apps for any platform are praised when they are intuitive, good-looking, and provide pleasant feedback to user interactions. Animation is one of the ways to do just that. Flutter, a cross-platform framework, has matured in the past two years to include web and desktop support. It has","og:url":"https:\/\/www.taterboy.com\/blog\/2019\/10\/animating-apps-with-flutter\/","article:published_time":"2019-10-15T11:19:02+00:00","article:modified_time":"2019-10-15T11:19:02+00:00","twitter:card":"summary","twitter:title":"Animating Apps With Flutter | Design for Immersive Technologies","twitter:description":"Animating Apps With FlutterAnimating Apps With Flutter Shubham 2019-10-14T13:30:59+02:002019-10-15T11:06:33+00:00Apps for any platform are praised when they are intuitive, good-looking, and provide pleasant feedback to user interactions. Animation is one of the ways to do just that. Flutter, a cross-platform framework, has matured in the past two years to include web and desktop support. It has"},"aioseo_meta_data":{"post_id":"71825","title":null,"description":null,"keywords":null,"keyphrases":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_custom_url":null,"og_image_custom_fields":null,"og_custom_image_width":null,"og_custom_image_height":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"created":"2021-02-07 17:14:50","updated":"2026-09-02 07:43:49","focus_keyword":null,"additional_keywords":null,"truseo_locale":null,"primary_term":null,"og_image_url":null,"og_image_width":null,"og_image_height":null,"twitter_image_url":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"limit_modified_date":false,"ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.taterboy.com\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.taterboy.com\/blog\/category\/general-info\/\" title=\"General Info\">General Info<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tAnimating Apps With Flutter\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.taterboy.com\/blog"},{"label":"General Info","link":"https:\/\/www.taterboy.com\/blog\/category\/general-info\/"},{"label":"Animating Apps With Flutter","link":"https:\/\/www.taterboy.com\/blog\/2019\/10\/animating-apps-with-flutter\/"}],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8wzr5-iGt","jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/www.taterboy.com\/blog\/wp-json\/wp\/v2\/posts\/71825","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.taterboy.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.taterboy.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.taterboy.com\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.taterboy.com\/blog\/wp-json\/wp\/v2\/comments?post=71825"}],"version-history":[{"count":0,"href":"https:\/\/www.taterboy.com\/blog\/wp-json\/wp\/v2\/posts\/71825\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.taterboy.com\/blog\/wp-json\/wp\/v2\/media?parent=71825"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.taterboy.com\/blog\/wp-json\/wp\/v2\/categories?post=71825"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.taterboy.com\/blog\/wp-json\/wp\/v2\/tags?post=71825"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}