{"data":{"allStrapiTutorial":{"edges":[{"node":{"id":"Tutorial_1","title":"Getting Started with Dart","category":"Dart","author":{"username":"Eric Windmill"},"lessons":[{"title":"About Dart","id":1,"slug":"about-dart","created_at":"2020-07-11T16:32:17.620Z"},{"title":"Install Dart on your machine","id":2,"slug":"install-dart-on-your-machine","created_at":"2020-07-12T16:26:34.263Z"},{"title":"Print to the console","id":8,"slug":"print-to-the-console","created_at":"2020-07-12T16:32:32.354Z"},{"title":"Text Editors: Intellij and VSCode","id":4,"slug":"text-editors-intellij-and-vs-code","created_at":"2020-07-12T16:30:19.074Z"},{"title":"Resources: Documentation and Pub.dev","id":5,"slug":"resources-documentation-and-pub-dev","created_at":"2020-07-12T16:31:01.327Z"},{"title":"The main function","id":7,"slug":"the-main-function","created_at":"2020-07-12T16:32:06.288Z"},{"title":"Hello World","id":6,"slug":"hello-world","created_at":"2020-07-12T16:31:30.794Z"},{"title":"Dartpad","id":3,"slug":"dartpad","created_at":"2020-07-12T16:27:03.138Z"}]}},{"node":{"id":"Tutorial_4","title":"Data Types","category":"Dart","author":{"username":"Eric Windmill"},"lessons":[{"title":"maps","id":20,"slug":"maps","created_at":"2020-07-18T17:16:47.921Z"},{"title":"Booleans","id":16,"slug":"booleans","created_at":"2020-07-18T17:14:43.256Z"},{"title":"sets","id":19,"slug":"sets","created_at":"2020-07-18T17:16:17.814Z"},{"title":"dynamic","id":17,"slug":"dynamic","created_at":"2020-07-18T17:15:17.428Z"},{"title":"Numbers","id":14,"slug":"numbers","created_at":"2020-07-18T17:13:04.092Z"},{"title":"Intro to Dart's Type System","id":13,"slug":"intro-to-dart-s-type-system","created_at":"2020-07-18T17:12:23.766Z"},{"title":"Strings","id":15,"slug":"strings","created_at":"2020-07-18T17:14:02.613Z"},{"title":"lists","id":18,"slug":"lists","created_at":"2020-07-18T17:15:46.896Z"}]}},{"node":{"id":"Tutorial_3","title":"Getting started with Flutter","category":"Flutter","author":{"username":"Eric Windmill"},"lessons":[{"title":"IDEs and resources","id":10,"slug":"id-es-and-resources","created_at":"2020-07-12T16:35:18.294Z"},{"title":"About Flutter","id":9,"slug":"about-flutter","created_at":"2020-07-12T16:34:48.933Z"}]}},{"node":{"id":"Tutorial_2","title":"Dart Fundamentals","category":"Dart","author":{"username":"Eric Windmill"},"lessons":[{"title":"Assignment Operators","id":23,"slug":"assignment-operators","created_at":"2020-07-18T17:33:57.739Z"},{"title":"Comments","id":12,"slug":"comments","created_at":"2020-07-12T16:36:15.220Z"},{"title":"Control Flow: if, else, else if","id":29,"slug":"control-flow-if-else-else-if","created_at":"2020-07-18T17:37:58.387Z"},{"title":"Loops: for and while","id":32,"slug":"loops-for-and-while","created_at":"2020-07-18T17:41:02.235Z"},{"title":"Values and variables","id":11,"slug":"values-and-variables","created_at":"2020-07-12T16:35:51.910Z"},{"title":"Anatomy of Dart Functions","id":33,"slug":"anatomy-of-dart-functions","created_at":"2020-07-18T17:41:34.320Z"},{"title":"Switch statements and case","id":30,"slug":"switch-statements-and-case","created_at":"2020-07-18T17:38:28.603Z"},{"title":"Arrow functions","id":34,"slug":"arrow-functions","created_at":"2020-07-18T17:42:16.738Z"},{"title":"Cascade notation","id":37,"slug":"cascade-notation","created_at":"2020-07-18T17:44:57.393Z"},{"title":"Function arguments: default, optional, named","id":35,"slug":"function-arguments-default-optional-named","created_at":"2020-07-18T17:43:22.856Z"},{"title":"Null Aware Operators","id":25,"slug":"null-aware-operators","created_at":"2020-07-18T17:35:16.943Z"},{"title":"Ternary Conditional operator","id":31,"slug":"ternary-conditional-operator","created_at":"2020-07-18T17:40:15.849Z"},{"title":"Logical Operators","id":24,"slug":"logical-operators","created_at":"2020-07-18T17:34:37.044Z"},{"title":"Bitwise and Shift Operators","id":28,"slug":"bitwise-and-shift-operators","created_at":"2020-07-18T17:37:15.233Z"},{"title":"const and final variables","id":21,"slug":"const-and-final-variables","created_at":"2020-07-18T17:32:20.744Z"},{"title":"Arithmetic and Comparison Operators","id":22,"slug":"arithmetic-and-comparison-operators","created_at":"2020-07-18T17:33:13.668Z"},{"title":"Lexical Scope","id":36,"slug":"lexical-scope","created_at":"2020-07-18T17:43:53.132Z"},{"title":"Type Test Operators","id":27,"slug":"type-test-operators","created_at":"2020-07-18T17:36:46.053Z"}]}},{"node":{"id":"Tutorial_5","title":"Object-Oriented Programming","category":"Dart","author":{"username":"Eric Windmill"},"lessons":[{"title":"Constructors","id":40,"slug":"constructors","created_at":"2020-07-18T21:04:48.329Z"},{"title":"Properties and methods","id":41,"slug":"properties-and-methods","created_at":"2020-07-18T21:05:32.147Z"},{"title":"Factory methods","id":46,"slug":"factory-methods","created_at":"2020-07-19T18:57:17.572Z"},{"title":"Initializer lists and final properties","id":45,"slug":"initializer-lists-and-final-properties","created_at":"2020-07-18T21:09:27.241Z"},{"title":"Singletons","id":47,"slug":"singletons","created_at":"2020-07-19T18:57:46.352Z"},{"title":"Classes","id":39,"slug":"classes","created_at":"2020-07-18T17:48:00.269Z"},{"title":"Intro to OOP","id":38,"slug":"intro-to-oop","created_at":"2020-07-18T17:47:22.222Z"},{"title":"Getters and setters","id":43,"slug":"getters-and-setters","created_at":"2020-07-18T21:07:33.215Z"},{"title":"Extending classes (inheritance)","id":44,"slug":"extending-classes-inheritance","created_at":"2020-07-18T21:08:21.225Z"},{"title":"Mixins","id":49,"slug":"mixins","created_at":"2020-07-19T18:58:42.361Z"},{"title":"Abstract classes (and interfaces)","id":48,"slug":"abstract-classes-and-interfaces","created_at":"2020-07-19T18:58:19.129Z"},{"title":"Methods: static, private, etc","id":42,"slug":"methods-static-private-etc","created_at":"2020-07-18T21:06:29.801Z"},{"title":"Extension methods","id":50,"slug":"extension-methods","created_at":"2020-07-19T18:59:12.861Z"}]}},{"node":{"id":"Tutorial_6","title":"Iterables, Iterators, and Collections","category":"Dart","author":{"username":"Eric Windmill"},"lessons":[{"title":"Adding elements: add and insert (all)","id":54,"slug":"adding-elements-add-and-insert-all","created_at":"2020-07-19T19:35:01.012Z"},{"title":"Deriving values from elements: fold, reduce, join","id":59,"slug":"deriving-values-from-elements-fold-reduce-join","created_at":"2020-07-19T19:45:42.646Z"},{"title":"What are collections (and iterables)?","id":51,"slug":"what-are-collections-and-iterables","created_at":"2020-07-19T19:02:44.719Z"},{"title":"Iterators: understanding and creating your own","id":61,"slug":"iterators-understanding-and-creating-your-own","created_at":"2020-07-19T19:48:27.567Z"},{"title":"Reading elements pt 1: first, last","id":53,"slug":"reading-elements-pt-1-first-last","created_at":"2020-07-19T19:33:03.485Z"},{"title":"Removing elements: remove, clear, removeWhere","id":56,"slug":"removing-elements-remove-clear-remove-where","created_at":"2020-07-19T19:37:35.751Z"},{"title":"Looping: for-in and forEach","id":52,"slug":"looping-for-in-and-for-each","created_at":"2020-07-19T19:05:07.612Z"},{"title":"Checking for elements: contains, indexOf, any, every","id":55,"slug":"checking-for-elements-contains-index-of-any-every","created_at":"2020-07-19T19:36:30.859Z"},{"title":"Iterable-like methods on maps (and putIfAbsent)","id":62,"slug":"iterable-like-methods-on-maps-and-put-if-absent","created_at":"2020-07-19T19:49:30.365Z"},{"title":"Type casting collections: cast, as, retype, toSet, toList","id":60,"slug":"type-casting-collections-cast-as-retype-to-set-to-list","created_at":"2020-07-19T19:47:16.641Z"},{"title":"Changing elements: map and expand","id":58,"slug":"changing-elements-map-and-expand","created_at":"2020-07-19T19:44:29.494Z"},{"title":"Filtering elements: where, takeWhile, and skipWhile","id":57,"slug":"filtering-elements-where-take-while-and-skip-while","created_at":"2020-07-19T19:40:21.637Z"}]}},{"node":{"id":"Tutorial_8","title":"Intro Flutter App","category":"Flutter","author":{"username":"Eric Windmill"},"lessons":[{"title":"Built-in Animation: AnimatedCrossFade","id":80,"slug":"built-in-animation-animated-cross-fade","created_at":"2020-07-21T16:27:54.626Z"},{"title":"Data Model and HTTP","id":71,"slug":"data-model-and-http","created_at":"2020-07-21T16:22:06.384Z"},{"title":"ListView and builder pattern","id":73,"slug":"list-view-and-builder-pattern","created_at":"2020-07-21T16:23:03.276Z"},{"title":"Sliders and Buttons","id":78,"slug":"sliders-and-buttons","created_at":"2020-07-21T16:26:14.188Z"},{"title":"Routing 2: Add a form page","id":76,"slug":"routing-2-add-a-form-page","created_at":"2020-07-21T16:25:20.996Z"},{"title":"User Input","id":77,"slug":"user-input","created_at":"2020-07-21T16:25:49.304Z"},{"title":"Intro and Setup","id":70,"slug":"intro-and-setup-basic-app","created_at":"2020-07-21T16:21:32.005Z"},{"title":"Built-in Animation: Hero transition","id":81,"slug":"built-in-animation-hero-transition","created_at":"2020-07-21T16:28:43.293Z"},{"title":"Gradient Backgrounds","id":74,"slug":"gradient-backgrounds","created_at":"2020-07-21T16:24:16.584Z"},{"title":"Build a custom widget","id":72,"slug":"build-a-custom-widget-basic-app","created_at":"2020-07-21T16:22:43.289Z"},{"title":"Snackbars and Dialogs","id":79,"slug":"snackbars-and-dialogs","created_at":"2020-07-21T16:26:45.724Z"},{"title":"Routing: Add a detail page","id":75,"slug":"routing-add-a-detail-page","created_at":"2020-07-21T16:24:53.143Z"}]}},{"node":{"id":"Tutorial_9","title":"Custom Animation: Progress Indicator","category":"Flutter","author":{"username":"Eric Windmill"},"lessons":[{"title":"Build the example app boiler-plate","id":83,"slug":"build-the-example-app-boiler-plate","created_at":"2020-07-24T17:01:01.352Z"},{"title":"Tween by example","id":86,"slug":"tween-by-example","created_at":"2020-07-24T17:41:14.728Z"},{"title":"Wrap the Pegs in AnimatedWidgets","id":88,"slug":"wrap-the-pegs-in-animated-widgets","created_at":"2020-07-24T17:42:02.927Z"},{"title":"Tween and AnimationController classes","id":85,"slug":"tween-and-animation-controller-classes","created_at":"2020-07-24T17:40:51.308Z"},{"title":"Intro and Overview","id":82,"slug":"progress-indicator-intro-and-overview","created_at":"2020-07-24T17:00:31.617Z"},{"title":"Bring it all together","id":122,"slug":"bring-it-all-together-2","created_at":"2020-08-06T16:10:41.270Z"},{"title":"Using Tweens and Intervals","id":87,"slug":"using-tweens-and-intervals","created_at":"2020-07-24T17:41:39.161Z"},{"title":"Custom Widget: Peg","id":84,"slug":"custom-widget-peg","created_at":"2020-07-24T17:01:38.537Z"}]}},{"node":{"id":"Tutorial_10","title":"State Management: Blocs without Libraries","category":"Flutter","author":{"username":"Eric Windmill"},"lessons":[{"title":"Consume the second bloc's streams","id":97,"slug":"consume-the-second-bloc-s-streams","created_at":"2020-07-25T14:59:55.408Z"},{"title":"Create bloc one","id":93,"slug":"create-bloc-one","created_at":"2020-07-25T14:57:38.670Z"},{"title":"What are blocs?","id":91,"slug":"what-are-blocs","created_at":"2020-07-25T14:56:35.995Z"},{"title":"Complete source code","id":98,"slug":"blocs-without-libs-complete-source-code","created_at":"2020-07-25T15:00:25.108Z"},{"title":"Create a bloc provider","id":94,"slug":"create-a-bloc-provider","created_at":"2020-07-25T14:58:07.644Z"},{"title":"Using StreamBuilders with blocs","id":95,"slug":"using-stream-builders-with-blocs","created_at":"2020-07-25T14:58:48.960Z"},{"title":"Calendar App introduction","id":92,"slug":"calendar-app-introduction","created_at":"2020-07-25T14:57:03.087Z"},{"title":"Create bloc two: Add/Edit Tasks","id":96,"slug":"create-bloc-two-add-edit-tasks","created_at":"2020-07-25T14:59:19.712Z"}]}},{"node":{"id":"Tutorial_7","title":"Widgets","category":"Flutter","author":{"username":"Eric Windmill"},"lessons":[{"title":"BuildContext","id":67,"slug":"build-context","created_at":"2020-07-21T16:15:19.204Z"},{"title":"The Widget tree","id":66,"slug":"the-widget-tree","created_at":"2020-07-21T16:14:40.226Z"},{"title":"Thinking in widgets","id":69,"slug":"thinking-in-widgets","created_at":"2020-07-21T16:16:34.917Z"},{"title":"StatefulWidget lifecycle","id":65,"slug":"stateful-widget-lifecycle","created_at":"2020-07-21T16:13:59.193Z"},{"title":"Widget types: Stateful and Stateless","id":64,"slug":"widget-types-stateful-and-stateless","created_at":"2020-07-21T16:12:58.163Z"},{"title":"Inherited Widgets","id":68,"slug":"inherited-widgets","created_at":"2020-07-21T16:15:57.541Z"},{"title":"Intro to Widgets","id":63,"slug":"intro-to-widgets","created_at":"2020-07-21T16:12:22.302Z"}]}},{"node":{"id":"Tutorial_12","title":"Handling Data with Brick: Offline First with Rest","category":"Flutter","author":{"username":"Tim Shedor"},"lessons":[{"title":"Adding a Repository","id":114,"slug":"adding-a-repository","created_at":"2020-07-25T15:14:18.594Z"},{"title":"Adding a Model","id":115,"slug":"adding-a-model","created_at":"2020-07-25T15:14:39.805Z"},{"title":"About Brick and setup","id":113,"slug":"about-brick-and-setup","created_at":"2020-07-25T15:12:06.073Z"},{"title":"Adding an Association","id":118,"slug":"adding-an-association","created_at":"2020-07-25T15:16:11.456Z"},{"title":"Generating Code","id":116,"slug":"generating-code","created_at":"2020-07-25T15:15:13.254Z"},{"title":"Rendering Models","id":117,"slug":"rendering-models","created_at":"2020-07-25T15:15:37.497Z"}]}},{"node":{"id":"Tutorial_11","title":"State Management: Provider","category":"Flutter","author":{"username":"Eric Windmill"},"lessons":[{"title":"Finer build control with Selector","id":109,"slug":"finer-build-control-with-selector-1","created_at":"2020-07-25T15:08:54.439Z"},{"title":"Rebuilding widgets with Consumer","id":102,"slug":"rebuilding-widgets-with-consumer","created_at":"2020-07-25T15:03:59.665Z"},{"title":"Stream Provider","id":106,"slug":"stream-provider","created_at":"2020-07-25T15:06:42.585Z"},{"title":"Future Provider","id":104,"slug":"future-provider","created_at":"2020-07-25T15:05:20.814Z"},{"title":"MultiProvider micro lesson","id":105,"slug":"multi-provider-micro-lesson","created_at":"2020-07-25T15:06:10.841Z"},{"title":"ChangeNotifierProvider","id":101,"slug":"change-notifier-provider","created_at":"2020-07-25T15:03:29.864Z"},{"title":"ProxyProvider","id":108,"slug":"proxy-provider","created_at":"2020-07-25T15:08:17.154Z"},{"title":"What is Provider?","id":99,"slug":"what-is-provider","created_at":"2020-07-25T15:01:45.156Z"},{"title":"For the curious: How is provider implemented","id":112,"slug":"for-the-curious-how-is-provider-implemented","created_at":"2020-07-25T15:11:19.002Z"},{"title":"The most basic example using Provider","id":100,"slug":"the-most-basic-example-using-provider","created_at":"2020-07-25T15:02:34.380Z"},{"title":"The final example (A shopping cart app)","id":111,"slug":"the-final-example-a-shopping-cart-app","created_at":"2020-07-25T15:10:34.826Z"},{"title":"Using .value constructors","id":110,"slug":"using-value-constructors","created_at":"2020-07-25T15:09:44.011Z"},{"title":"Using context extensions for more control","id":107,"slug":"using-context-extensions-for-more-control","created_at":"2020-07-25T15:07:23.488Z"},{"title":"Finer build control with Selector","id":103,"slug":"finer-build-control-with-selector","created_at":"2020-07-25T15:04:30.616Z"}]}}]},"strapiTableOfContents":{"contents":"{\n  \"Dart\": {\n    \"Getting Started with Dart\": [\n      \"About Dart\",\n      \"Install Dart on your machine\",\n      \"Dartpad\",\n      \"Text Editors: Intellij and VSCode\",\n      \"Resources: Documentation and Pub.dev\",\n      \"Hello World\",\n      \"The main function\",\n      \"Print to the console\"\n    ],\n    \"Dart Fundamentals\": [\n      \"Values and variables\",\n      \"Comments\",\n      \"const and final variables\",\n      \"Arithmetic and Comparison Operators\",\n      \"Assignment Operators\",\n      \"Logical Operators\",\n      \"Null Aware Operators\",\n      \"Type Test Operators\",\n      \"Bitwise and Shift Operators\",\n      \"Control Flow: if, else, else if\",\n      \"Switch statements and case\",\n      \"Ternary Conditional operator\",\n      \"Loops: for and while\",\n      \"Anatomy of Dart Functions\",\n      \"Arrow functions\",\n      \"Function arguments: default, optional, named\",\n      \"Lexical Scope\",\n      \"Cascade notation\"\n    ],\n    \"Data Types\": [\n      \"Intro to Dart's Type System\",\n      \"Numbers\",\n      \"Strings\",\n      \"Booleans\",\n      \"dynamic\",\n      \"lists\",\n      \"sets\",\n      \"maps\"\n    ],\n    \"Object-Oriented Programming\": [\n      \"Intro to OOP\",\n      \"Classes\",\n      \"Constructors\",\n      \"Properties and methods\",\n      \"Methods: static, private, etc\",\n      \"Getters and setters\",\n      \"Extending classes (inheritance)\",\n      \"Initializer lists and final properties\",\n      \"Factory methods\",\n      \"Singletons\",\n      \"Abstract classes (and interfaces)\",\n      \"Mixins\",\n      \"Extension methods\"\n    ],\n    \"Iterables, Iterators, and Collections\": [\n      \"What are collections (and iterables)?\",\n      \"Looping: for-in and forEach\",\n      \"Reading elements pt 1: first, last\",\n      \"Adding elements: add and insert (all)\",\n      \"Checking for elements: contains, indexOf, any, every\",\n      \"Removing elements: remove, clear, removeWhere\",\n      \"Filtering elements: where, takeWhile, and skipWhile\",\n      \"Changing elements: map and expand\",\n      \"Deriving values from elements: fold, reduce, join\",\n      \"Type casting collections: cast, as, retype, toSet, toList\",\n      \"Iterators: understanding and creating your own\",\n      \"Iterable-like methods on maps (and putIfAbsent)\"\n    ]\n  },\n  \"Flutter\": {\n    \"Getting started with Flutter\": [\n      \"About Flutter\",\n      \"IDEs and resources\"\n    ],\n    \"Widgets\": [\n      \"Intro to Widgets\",\n      \"Widget types: Stateful and Stateless\",\n      \"StatefulWidget lifecycle\",\n      \"The Widget tree\",\n      \"BuildContext\",\n      \"Inherited Widgets\",\n      \"Thinking in widgets\"\n    ],\n    \"Intro Flutter App\": [\n      \"Intro and Setup\",\n      \"Data Model and HTTP\",\n      \"Build a custom widget\",\n      \"ListView and builder pattern\",\n      \"Gradient Backgrounds\",\n      \"Routing: Add a detail page\",\n      \"Routing 2: Add a form page\",\n      \"User Input\",\n      \"Sliders and Buttons\",\n      \"Snackbars and Dialogs\",\n      \"Built-in Animation: AnimatedCrossFade\",\n      \"Built-in Animation: Hero transition\"\n    ],\n    \"Custom Animation: Progress Indicator\": [\n      \"Intro and Overview\",\n      \"Build the example app boiler-plate\",\n      \"Custom Widget: Peg\",\n      \"Tween and AnimationController classes\",\n      \"Tween by example\",\n      \"Using Tweens and Intervals\",\n      \"Wrap the Pegs in AnimatedWidgets\",\n      \"Bring it all together\"\n    ],\n    \"State Management: Blocs without Libraries\": [\n      \"What are blocs?\",\n      \"Calendar App introduction\",\n      \"Create bloc one\",\n      \"Create a bloc provider\",\n      \"Using StreamBuilders with blocs\",\n      \"Create bloc two: Add/Edit Tasks\",\n      \"Consume the second bloc's streams\",\n      \"Complete source code\"\n    ],\n    \"State Management: Provider\": [\n      \"What is Provider?\",\n      \"The most basic example using Provider\",\n      \"ChangeNotifierProvider\",\n      \"Rebuilding widgets with Consumer\",\n      \"Finer build control with Selector\",\n      \"Future Provider\",\n      \"MultiProvider micro lesson\",\n      \"Stream Provider\",\n      \"Using context extensions for more control\",\n      \"ProxyProvider\",\n      \"Using .value constructors\",\n      \"The final example (A shopping cart app)\",\n      \"For the curious: How is provider implemented\"\n    ],\n    \"Handling Data with Brick: Offline First with Rest\": [\n      \"About Brick and setup\",\n      \"Adding a Repository\",\n      \"Adding a Model\",\n      \"Generating Code\",\n      \"Rendering Models\",\n      \"Adding an Association\"\n    ]\n  }\n}"}}}