INDEX

  • A
  • abstract class, 414–415, 424, 427, 450
  • accessing main() function, 64
  • actions property, 104
  • adding
    • animation to apps, 151–175
    • AppBar widgets, 105–107
    • authentication to client journal app, 395–403
    • AuthenticationBloc class, 432–434
    • AuthenticationBlocProvider class, 435–436
    • basic layout to client journal app, 403–406
    • BLoC pattern, 432–449
    • BLoCs to Firestore client app pages, 453–487
    • classes to client journal app, 406–408
    • Cloud Firestore database to journal app, 391–395
    • Cloud Firestore packages to client journal app, 395–403
    • drag and drop, 275–277
    • edit journal page, 472–484
    • Firebase to journal app, 375–410
    • Firestore to journal app, 375–410
    • HomeBloc class, 441–443
    • HomeBlocProvider class, 443–444
    • Journal model class, 422–424
    • JournalEditBloc class, 444–447
    • JournalEditBlocProvider class, 447–449
    • login page, 454–460
    • LoginBloc class, 436–440
    • service classes, 424–430
    • state management to Firestore client app, 411–451
    • Validators class, 430–432
  • addOrEditJournal() method, 338–339, 362–364, 368, 371, 467, 471, 472
  • addOrUpdateJournal() method, 476
  • ahead‐of‐time (AOT), 44
  • Android Emulator
    • setting up on Linux, 19
    • setting up on macOS, 15
    • setting up on Windows, 17
  • Android host platform channel, implementing, 318–321
  • Android Studio
    • about, 23
    • configuring editor for, 20
    • installing on Linux, 19
    • installing on macOS, 14–15
    • installing on Windows, 16–17
  • animatedBalloon() method, staggered animations and, 172, 174
  • AnimatedBuilder widget, 176
  • AnimatedContainer widget
  • AnimatedCrossFade widget
  • animatedOpacity() method, 160–163
  • AnimatedOpacity widget
  • animation
    • adding to apps, 151–175
    • using AnimatedContainer widget, 152–155
    • using AnimatedCrossFade widget, 155–159
    • using AnimatedOpacity widget, 160–163
    • using AnimationController class, 164–170
    • using staggered animation, 170–175
  • AnimationController class
  • AOT (ahead‐of‐time), 44
  • AppBar widgets, 77, 78, 104, 105–107
  • applying
    • interactivity, 267–305
    • themes, 42
  • apps
    • adding animation to, 151–175
    • creating, 26–30
    • creating navigation for, 177–219
    • running, 30–32
    • styling using themes, 33–36
  • arithmetic operators, 49
  • arrays, declared in JSON, 328–329
  • askToOpen() method, 53
  • assert statement, 58
  • AssetBundle class, 130–131
  • assignment operators, 50
  • asynchronous programming, implementing, 64
  • authentication capabilities
    • adding to client journal app, 395–403
    • Firebase, 380–381, 410
  • AuthenticationBloc class, 432–434, 465–472, 486
  • AuthenticationBlocProvider class, 435–436, 460–464, 486
  • AuthenticationService class, 414–415, 424–430
  • B
  • BLoC classes, 415–416, 450, 453–487
  • BLoC dependency injection, 450
  • BLoC pattern
    • about, 450
    • adding, 432–449
    • implementing, 417–419
  • blocs folder, 421
  • Boolean variables
    • about, 47
    • declared in JSON, 328–329
  • BottomAppBar widget, 199–203, 219
  • BottomNavigationBar widget, 193–199, 219
  • BoxDecoration class, 135
  • break statement, 54
  • build() method, 6, 7, 8, 11
  • buildBody() method, 259–260
  • buildCompleteTrip() method, 299, 300
  • BuildContext objects, 9, 86
  • buildDraggable() method, 275–276
  • buildDragTarget() method, 276
  • buildJournalEntry() method, 260, 261
  • buildJournalFooterImages() method, 260, 263–265
  • buildJournalHeaderImage() method, 261
  • buildJournalTags() method, 260, 263
  • buildJournalWeather() method, 260, 262
  • buildListViewSeparate() method, 369, 371
  • buildRemoveTrip() method, 299, 301
  • ButtonBar widget, 126–130
  • Buttons widget, 104, 119–130
  • buttonsCreateAccount() method, 458
  • buttonsLogin() method, 458–460
  • C
  • Card widget, 222–223, 251
  • cascade notation, 51
  • case clause, 55
  • Center() widget, 469
  • checking orientation, 143–149, 150
  • child property, 108
  • Chip widget, 256, 266
  • CircleAvatar widget, 78, 266
  • CircularProgressIndicator, 374
  • class inheritance, 60
  • class mixins, 60–61
  • classes
  • classes folder, 421
  • client platform channel app, implementing, 309–313
  • Cloud Firestore
    • about, 410
    • adding database to journal app, 391–395
    • adding packages to client journal app, 395–403
    • collections, 410
    • documents, 410
    • security rules, 410
    • structuring and data modeling, 377–379
    • viewing security rules, 381–383
  • cloud_firestore package, 410
  • code, commenting, 44–45, 64
  • collections, Cloud Firestore, 410
  • column nesting, 115–117
  • Column() widget, 36, 78, 104, 114–119, 254, 256, 257, 266, 471
  • commenting code, 44–45, 64
  • composition, 257
  • conditional expressions, 51
  • configuring
    • Android Studio editor, 20
    • Firebase, 383–391
  • confirmDeleteJournal() method, 467, 471–472
  • confirmDismiss property, 487
  • constants, refactoring with, 86
  • Container widget, 78, 104, 108–112, 469, 470
  • continue statement, 54–55
  • copyWith method, 36
  • createElement method, 9–10
  • creating
    • apps, 26–30
    • Firebase projects, 383–391
    • folders/files, 65–68
    • full widget trees, 79–85, 100
    • journal app, 335–371
    • layouts, 253–266, 257–265
    • navigation for apps, 177–219
    • scrolling lists/effects, 221–251
    • shallow widget trees, 85–98, 100
    • state management, 421–449
  • crossFade() method, 155–156
  • CupertinoApp widget, 69
  • CupertinoNavigationBar widget, 78
  • CupertinoPageScaffold widget, 78
  • CupertinoTabScaffold widget, 78
  • curly brackets, 328, 340, 346, 347, 407
  • customizing CustomScrollView widget with slivers, 243–250, 251
  • CustomScrollView widget
    • about, 221
    • customizing with slivers, 243–250, 251
  • D
  • Dart
    • about, 4, 22, 23
    • Boolean variables, 47
    • break statement, 54
    • case clause, 55
    • class inheritance, 60
    • class mixins, 60–61
    • commenting code, 44–45
    • continue statement, 54–55
    • declaring variables, 46–49
    • do‐while loop, 53–54
    • else statement, 51–52
    • if statement, 51–52
    • implementing asynchronous programming, 61–62
    • import packages, 57
    • installing plugin for, 20
    • lists, 47–48
    • for loops, 52–53
    • maps, 48
    • number variables, 47
    • reasons for using, 43–44
    • referencing variables, 45–46
    • runes, 48–49
    • running main() entry point, 45
    • string variables, 47
    • switch statement, 55
    • ternary operator, 52
    • using classes, 57–61
    • using flow statements, 51–55
    • using functions, 55–57
    • using operators, 49–51
    • while loop, 53–54
  • dart:convert library, 374
  • dart:io library, 374
  • dart:math, 374
  • data
    • retrieving with FutureBuilder widget, 333–334
    • saving with local persistence, 327–374
  • data modeling, Cloud Firestore, 377–379
  • Database class, 330–331, 339–344, 373
  • database classes
    • about, 373
    • JSON and, 330–331
  • DatabaseFileRoutines class, 330–331, 339–344, 373
  • DateFormat, 373
  • dates
    • formatting, 331–332
    • sorting lists of, 332–333
  • DateTime.parse(), 373
  • deactivate() method, 8
  • Declarative user interface (UI), 22
  • declaring variables, 46–49
  • decorators, 135–139, 150
  • deleteTrip() method, 299–300, 303
  • dependencies
    • checking for in Linux, 19
    • checking for in Windows, 16
    • checking for on macOS, 14
  • dependency injection, 415, 450, 486
  • didChangeDependencies() method, 8, 474
  • didFinishLaunchingWithOptions method, 316
  • didUpdateWidget() method, 8
  • Dismissable widget, 296–303, 305, 360, 365, 371, 373, 465–472, 470, 487
  • dispose() method, 7, 350, 433, 438, 442, 456, 460, 475
  • Divider widget, 78, 261, 266, 470, 487
  • documentation comments, 44–45
  • documents, Cloud Firestore, 410
  • do‐while loop, 53–54
  • drag and drop, adding, 275–277
  • Draggable widget, 271, 275–277, 305
  • DragTarget widget, 271, 275–277, 305
  • Drawer widget, 207–217, 219
  • DropDownButton() widget, 487
  • Duration class, 155
  • E
  • edit journal page, adding, 472–484
  • EditJournalBloc class, 465
  • editor, Android Studio, 20
  • Element objects, 9
  • element trees
    • about, 8–9, 22
    • stateful widget and, 10–12
    • stateless widget and, 9–10
  • elements, 5, 22
  • else statement, 51–52
  • Emulator (Android)
    • setting up on Linux, 19
    • setting up on macOS, 15
    • setting up on Windows, 17
  • equality operators, 49
  • Expanded widget, 78
  • external packages, 38–41, 42
  • F
  • final layout, 257
  • Firebase
    • about, 376–377, 410
    • adding to journal app, 375–410
    • authentication, 410
    • configuring, 383–391
    • console panel website, 391
    • viewing authentication capabilities, 380–381
  • firebase_auth package, 410
  • Firestore. See also Cloud Firestore
    • about, 376–377
    • adding BLoC classes to client app pages, 453–487
    • adding state management to, 411–451
    • adding to journal app, 375–410
  • FlatButton widget, 121
  • flexibleSpace property, 104
  • FloatingActionButton widget, 119–120, 180
  • flow statements, 51–55, 64
  • Flutter. See Google Flutter
  • Flutter plugin, 23
  • Flutter SDK
    • about, 23
    • installing, 13–19
  • FlutterMethodChannel method, 323
  • FocusNode, 373
  • folders/files, creating and organizing, 65–68
  • footer images layout, 257
  • for loops, 52–53
  • Form widget, 139–143
  • FormatDates class, 407–408, 465, 487
  • formatting dates, 331–332
  • FormState validate method, 139, 143
  • fullscreenDialog property, 178–179
  • functions, 55–57, 64
  • Future object, 61–62, 373
  • FutureBuilder widget, 333–334, 360, 371, 373
  • G
  • gesture status bar, adding InkWell and InkResponse to, 291–296
  • GestureDetector() widget
    • AnimationController class and, 168
    • Hero widget and, 189
    • interactivity and, 267–274, 305
    • setting up, 267–274
    • staggered animations and, 173
    • using for moving and scaling, 278–284
  • getApplicationDocumentsDirectory() method, 330–331
  • getDeviceInfo() method, 312, 320
  • getFlutterView() method, 321
  • getIconList() method, 234
  • getJournal method, 446–447
  • global app themes, 33–35
  • Google Cloud Platform, 383
  • Google Flutter. See also specific topics
    • about, 3–4, 22
    • website, 13
  • GoogleService‐Info.plist file, 410
  • google‐services.json file, 410
  • GridView widget, 143, 230–236, 251
  • H
  • Hello World app
    • project setup, 25–30
    • stateless and stateful widgets, 37–38
    • using external packages, 38–41
    • using hot reload, 30–32
    • using themes to style your app, 33–36
  • Hero widget, 188–192, 219
  • home page, modifying, 465–472
  • HomeBloc class, 441–443, 486
  • HomeBlocProvider class, 443–444, 460–464, 465–472, 486
  • home.dart, 75
  • hot reload, 30–32, 42
  • I
  • Icon widget, 132–135, 266
  • IconButton widget, 122–123
  • icons, 130–135
  • if statement, 51–52
  • Image widget, 131–132, 255, 266
  • images, 130–135, 150
  • implementing
    • abstract class, 414–415
    • Android host platform channel, 318–321
    • asynchronous programming, 61–62, 64
    • BLoC pattern, 417–419
    • client platform channel app, 309–313
    • Draggable widget, 275–277
    • DragTarget widget, 275–277
    • FlutterMethodChannel method, 323
    • InheritedWidget class, 415–416
    • invokeMethod method, 323
    • iOS host platform channel, 313–318
    • MethodChannel, 323
    • model class, 416
    • packages, 40–41
    • service class, 417
    • setMethodCallHandler method, 323
    • Sink property, 419–420
    • state management, 412–420
    • Stream class, 419–420
    • StreamBuilder widget, 419–420
    • StreamController class, 419–420
  • import packages, 57
  • import statement, 57
  • importing packages, 64
  • increaseWidth() method, 152, 153
  • InheritedWidget class, 6, 415–416, 418, 421, 451, 486
  • initializing packages, 40–41
  • initState() method
    • about, 7
    • AnimationController class and, 167
    • client platform channel app and, 312
    • interactivity and, 298
    • journal app and, 349–350, 456, 460, 466, 474
    • Navigator widget and, 185
    • staggered animations and, 171–172
  • InkResponse widget, 289–296, 305
  • InkWell widget, 189, 289–296, 305
  • InputDecoration class, 135–136
  • installing
    • Android Studio on Linux, 19
    • Android Studio on macOS, 14–15
    • Android Studio on Windows, 16–17
    • Dart plugin, 20
    • Flutter plugin, 20
    • Flutter SDK, 13–19
    • Xcode on macOS, 14
  • interactivity
    • applying, 267–305
    • Dismissable widget, 296–303, 305
    • Draggable widget, 275–277, 305
    • DragTarget widget, 275–277, 305
    • GestureDetector widget, 267–274, 278–289, 305
    • InkResponse widget, 289–296, 305
    • InkWell widget, 289–296, 305
  • Interval(), staggered animations and, 170–171
  • intl package, 374
  • invokeMethod method, 323
  • iOS host platform channel, implementing, 313–318
  • J
  • JIT (just‐in‐time), 44
  • journal app
    • adding BLoC pattern, 432–449
    • adding Cloud Firestore database to, 391–395
    • adding edit journal page, 472–484
    • adding Firebase and Firestore, 375–410
    • adding journal database classes, 339–344
    • adding journal entry page, 344–359
    • adding Journal model class, 422–424
    • adding login page, 454–460
    • adding service classes, 424–430
    • adding Validators class, 430–432
    • building, 335–371
    • building client journal app, 395–408
    • finishing home page, 359–371
    • laying foundations of, 337–339
    • modifying home page, 465–472
    • modifying main page, 460–464
  • Journal class, 330–331, 339–344, 373, 422–424
  • JournalEdit class, 330–331, 339–344, 373
  • JournalEditBloc class, 444–447, 486
  • JournalEditBlocProvider class, 447–449, 472–484
  • Journal.fromDoc() method, 423–424
  • JSON format
    • about, 328–330
    • database classes and, 330–331
  • just‐in‐time (JIT), 44
  • L
  • layouts
    • about, 253–255
    • adding to client journal app, 403–406
    • building, 253–266
    • creating, 257–265
    • final, 257
    • footer images, 257
    • tags, 256–257
    • weather section, 256
  • leading property, 104
  • lib folder, 25–26
  • Linux, installing Flutter SDK on, 17–19
  • listen() method, 419
  • lists, variables for, 47–48
  • List().sort, 373
  • ListTile widget, 223–229, 251, 367, 471
  • ListView widget, 207–217, 219, 223–229, 251, 373, 487
  • loadJournals() method, 371
  • logical operators, 50
  • login page, adding, 454–460
  • LoginBloc class, 436–440, 454–455, 486
  • M
  • macOS, installing Flutter SDK on, 13–15
  • main() entry point, running, 44–45
  • main page, modifying, 460–464
  • main() function, 9, 62, 64
  • main.dart, 75
  • maps, variables for, 48
  • markTripComplete() method, 299–300, 303
  • Material Components widgets, 26
  • MaterialApp widget, 69, 188, 462
  • MaterialPageRoute class, 178, 180–181
  • Matrix4 rotateZ() method, 487
  • MethodChannel, 309–313, 323
  • methods
    • addOrEditJournal(), 338–339, 362–364, 368, 371, 467, 471, 472
    • addOrUpdateJournal(), 476
    • animatedBalloon(), 172, 174
    • animatedOpacity(), 160–163
    • askToOpen(), 53
    • build(), 6, 7, 8, 11
    • buildBody(), 259–260
    • buildCompleteTrip(), 299, 300
    • buildDraggable(), 275–276
    • buildDragTarget(), 276
    • buildJournalEntry(), 260, 261
    • buildJournalFooterImages(), 260, 263–265
    • buildJournalHeaderImage(), 261
    • buildJournalTags(), 260, 263
    • buildJournalWeather(), 260, 262
    • buildListViewSeparate(), 369, 371
    • buildRemoveTrip(), 299, 301
    • buttonsCreateAccount(), 458
    • buttonsLogin(), 458–460
    • confirmDeleteJournal(), 467, 471–472
    • copyWith, 36
    • createElement, 9–10
    • crossFade(), 155–156
    • deactivate(), 8
    • deleteTrip(), 299–300, 303
    • didChangeDependencies(), 8, 474
    • didFinishLaunchingWithOptions, 316
    • didUpdateWidget(), 8
    • dispose(), 7, 350, 433, 438, 442, 456, 460, 475
    • FlutterMethodChannel, 323
    • FormState validate, 139, 143
    • getApplicationDocumentsDirectory(), 330–331
    • getDeviceInfo(), 312, 320
    • getFlutterView(), 321
    • getIconList(), 234
    • getJournal, 446–447
    • increaseWidth(), 152, 153
    • initState(), 7, 167, 171–172, 185, 298, 312, 349–350, 456, 460, 466, 474
    • invokeMethod, 323
    • Journal.fromDoc(), 423–424
    • listen(), 419
    • loadJournals(), 371
    • markTripComplete(), 299–300, 303
    • Matrix4 rotateZ(), 487
    • Navigator.pop, 178, 187
    • notImplemented(), 320
    • of(), 416
    • onAuthChanged(), 433
    • onCreate, 320
    • onDoubleTap(), 287, 288
    • onLongPress(), 289, 293–294, 295
    • onPressed(), 153, 345, 353
    • onScaleStart(), 288
    • onScaleUpdate(), 288
    • openPageAbout(), 179–181, 182
    • openPageGratitude(), 181–182
    • radioOnChanged(), 184
    • readAsString(), 331
    • refactoring with, 86–91
    • resetToDefaultValues(), 287–289, 294
    • rotateZ(), 471, 472–484, 478–484
    • runApp(), 9
    • runTransaction(), 424–425
    • saveJournal(), 447
    • setMethodCallHandler, 323
    • setScaleBig, 293–294, 295
    • setScaleSmall, 293–294, 295
    • setState(), 6–7, 8, 11, 37, 152, 155–156, 160–163, 195, 199, 285–287, 294, 310–312, 362–363, 412
    • showDialog(), 467
    • showTimePicker(), 345, 472–484, 487
    • sink.add(), 434, 441
    • tabChanged, 205–206
    • void _signOut(), 434
    • Widget build(), 456–457, 462, 463, 469, 476
    • writeAsString(), 331
  • methods, refactoring with, 86–91
  • mkdir command, 75
  • model class, 416, 450
  • models folder, 421
  • modifying
    • home page, 465–472
    • main page, 460–464
  • MoodIcons class, 407–408, 465, 471, 478, 487
  • moving, using GestureDetector widget for, 278–284
  • multiline comments, 44
  • N
  • navigation
    • BottomAppBar widget, 199–203, 219
    • BottomNavigationBar widget, 193–199, 219
    • creating for apps, 177–219
    • Drawer widget, 207–217, 219
    • Hero widget, 188–192, 219
    • ListView widget, 207–217, 219
    • Navigator widget, 178–188, 219
    • TabBar widget, 203–207, 219
    • TabBarView widget, 203–207, 219
  • Navigator widget, 178–188, 219, 373
  • Navigator.pop method, 178, 187
  • nesting widgets, 100
  • notImplemented() method, 320
  • number variables, 47
  • numbers, declared in JSON, 328–329
  • O
  • objects, declared in JSON, 328–329
  • of() method, 416
  • onAuthChanged() method, 433
  • onCreate method, 320
  • onDoubleTap() method, 287, 288
  • onLongPress() method, 289, 293–294, 295
  • onPressed() method, 153, 345, 353
  • onScaleStart() method, 288
  • onScaleUpdate() method, 288
  • openPageAbout() method, 179–181, 182
  • openPageGratitude() method, 181–182
  • operators, 49–51, 64
  • organizing folders/files, 65–68
  • orientation, checking, 143–149, 150
  • OrientationBuilder widget, 143
  • P
  • packages
    • cloud_firestore, 410
    • firebase_auth, 410
    • importing, 64
    • intl, 374
    • path_provider, 374
    • searching for, 39–40
    • using, 40–41
  • Padding widget, 78, 266
  • pages folder, 421
  • path_provider package, 374
  • persistence
    • about, 327–328
    • building journal app, 335–371
    • database classes and JSON, 330–331
    • formatting dates, 331–332
    • JSON format, 328–330
    • retrieving data with FutureBuilder widget, 333–334
    • saving data with local, 327–374
    • sorting lists of dates, 332–333
  • platform channels, 307–308
  • platform‐native code
    • implementing Android host platform channel, 318–321
    • implementing client platform channel app, 309–313
    • implementing iOS host platform channel, 313–318
    • platform channels, 307–308
    • writing, 307–323
  • PopupMenuButton widget, 123–126
  • Positioned widget, 79
  • print statement, 56
  • print statement, 53
  • properties
    • actions, 104
    • child, 108
    • confirmDismiss, 487
    • flexibleSpace, 104
    • fullscreenDialog, 178–179
    • leading, 104
    • Sink, 419–420, 450
    • title, 104
  • R
  • radioOnChanged() method, 184
  • RaisedButton widget, 121–122
  • readAsString() method, 331
  • refactoring
    • with constants, 86
    • with methods, 86–91
    • with widget classes, 91–98
  • referencing variables, 45–46
  • relational operators, 49
  • render tree, 9, 23
  • RenderObject, 9, 22
  • replacing text with RichText child containers, 113–114
  • resetToDefaultValues() method, 287–289, 294
  • retrieving data with FutureBuilder widget, 333–334
  • return null statement, 55–56
  • RichText widget, 104, 112–114
  • root folder, 421
  • rotateZ() method, 471, 472–484, 478–484
  • route name, for navigation, 188
  • row nesting, 115–117
  • Row widget, 78, 104, 115–119, 255, 266
  • runApp() method, 9
  • runes, as variables, 48–49
  • running
    • apps, 30–32
    • main() entry point, 45
  • runTransaction() method, 424–425
  • S
  • SafeArea widget, 104, 107–108, 266
  • saveJournal() method, 447
  • saving data with local persistence, 327–374
  • Scaffold widget, 77, 78, 104
  • scaling, using GestureDetector widget for, 278–284
  • scrolling lists/effects
    • Card widget, 222–223, 251
    • creating, 221–251
    • customizing CustomScrollView widget with slivers, 243–250, 251
    • GridView widget, 230–236, 251
    • ListTile widget, 223–229, 251
    • ListView widget, 223–229, 251
    • Stack widget, 237–243, 251
  • security rules, Cloud Firestore, 381–383, 410
  • service classes
    • about, 450
    • adding, 424–430
    • implementing, 417
  • services folder, 421
  • setMethodCallHandler method, 323
  • setScaleBig method, 293–294, 295
  • setScaleSmall method, 293–294, 295
  • setState() method
    • about, 6–7, 8, 11, 37
    • AnimatedContainer widget and, 152, 155
    • AnimatedCrossFade widget and, 155–156
    • AnimatedOpacity and, 160–163
    • BottomNavigationBar widget and, 195, 199
    • client platform channel app and, 311–312
    • GestureDetector widget and, 285–287
    • interactivity and, 294, 300
    • journal app and, 362–363
    • state management and, 412
  • setup
    • Android Emulator on Linux, 19
    • Android Emulator on macOS, 15
    • Android Emulator on Windows, 17
    • GestureDetector widget, 267–274
    • of project for Hello World app, 25–30
  • showDatePicker() function, 345, 359, 373, 478
  • showDialog() method, 467
  • showTimePicker() method, 345, 472–484, 487
  • SingleChildScrollview widget, 78, 266
  • single‐line comments, 44
  • Sink property, 419–420, 450
  • sink.add() method, 434, 441
  • SizedBox widget, 256, 257, 266
  • Skia, 4, 22
  • SliverAppBar widget, 243–250
  • SliverGrid widget, 243–250
  • SliverList widget, 243–250
  • slivers, customizing CustomScrollView widget with, 243–250, 251
  • slivers widgets, 221
  • SliverSafeArea widget, 243–250
  • sorting lists of dates, 332–333
  • square brackets, 328
  • Stack widget, 79, 237–243, 251
  • staggered animation, 170–175
  • starter project template
    • creating folders/files, 65–68
    • organizing folders/files, 65–68
    • structuring widgets, 69–74
  • State class, 30, 37
  • state management
    • about, 450
    • adding to Firestore client app, 411–451
    • building, 421–449
    • implementing, 412–420
  • State object, 6, 11
  • stateful widget
    • about, 37–38
    • element trees and, 10–12
  • StatefulWidget class, 6–8, 22, 37
  • stateless widget
    • about, 37–38
    • element trees and, 9–10
  • StatelessWidget class, 6, 22
  • Stream class, 61–62, 419–420, 450
  • StreamBuilder widget, 419–420, 450, 460–484, 486
  • StreamController class, 419–420, 450
  • string variables, 47
  • strings, declared in JSON, 328–329
  • structuring
    • Cloud Firestore, 377–379
    • widgets, 69–74
  • styling apps using themes, 33–36
  • switch statement, 55
  • T
  • TabBar widget, 203–207, 219
  • TabBarView widget, 203–207, 219
  • tabChanged method
    • TabBar widget and, 205–206
    • TabBarView widget and, 205–206
  • tags layout, 256–257
  • ternary operator, 52
  • text fields
    • using forms for validating, 150
    • validating with Form widget, 139–143
  • Text widget, 11–12, 78, 104, 112–114, 178, 255, 266
  • TextEditingController, 373
  • TextField widget, 373, 472–484
  • TextInputAction, 373
  • themes
    • applying, 42
    • styling apps using, 33–36
  • Ticker class, 164
  • title property, 104
  • Transform widget, 278–283, 471
  • type test operators, 50
  • U
  • Unicode, 48–49
  • V
  • validating text fields using Form widget, 139–143
  • Validators class, 430–432, 436, 440, 450
  • variables
    • Boolean, 47
    • declaring, 46–49
    • lists as, 47–48
    • maps as, 48
    • number, 47
    • referencing, 45–46
    • runes as, 48–49
    • string, 47
    • using, 64
  • viewing
    • Cloud Firestore security rules, 381–383
    • Firebase authentication capabilities, 380–381
  • void_signOut() method, 434
  • X
  • Xcode
    • about, 23
    • installing on macOS, 14
..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset