This certificate above verifies that ANDREW YU MING XIN successfully completed the course Flutter & Dart - The Complete Guide [2023 Edition] on 09/04/2023 as taught by Academind by Maximilian Schwarzmüller, Maximilian Schwarzmüller on Udemy. The certificate indicates the entire course was completed as validated by the student. The course duration represents the total video hours of the course at time of most recent completion.
- Flutter is UI Framework for cross-platform (Android, IOS, Web, Windows, macOS, Linux) powered by Dart language, natively compiled. However, need macOS for IOS + macOS, for Appstore. Windows for Android + Web
- Flutter creates UI by nesting widgets (widget tree), inside runApp(), inside main(), which gets executed automatically by Dart
- varName, functionName, ClassName, file_name.dart conventions
- const is immutable compile-time constant
- final is mutable run-time constant
- var
- Primitive Object, Bool, String, num, int, double
- Complex Widgets
- WidgetType widget1(positionalParameter, [b], [c = 5]) {...}
- WidgetType widget1({ namedParameter1, namedParameter2 = 5 }) {...}
- WidgetType widget1(a, {required b}) {...}
- Classes, setState, "${}"
- Scaffold (Base screen)
- Container, BoxDecoration, LinearGradient, Center, Column, TextButton, Image.file/network/asset (Show image from file/url)
- StatelessWidgets
- StatefulWidget, Alignment, MainAxisSize, EdgeInsets (all, symmetric, LTRB, only), Colors.black/Color.fromARGB/Color(8-digit hexadecimal/FF...6-digit hexadecimal), TextStyle, Text
- Opacity is performance-intensive! use alpha in Color.fromARGB(150, 255, 255, 255) instead
- Alternative constructors Eg. OutlinedButton vs OutlinedButton.icon for icon
- Container(padding:..., margin:...) = Padding(padding:...) widget,
- Installing 3rd party packages (GoogleFonts)
- Getters: "getting a value", used as a property, internally is a method
- .shuffle() to randomly shuffle mutate in-place, List.of(...) to create copy of list, .add(), .map(), .where(), Map<keyType, valueType>, Map typecasting as Dart doesn't know type of value in Map Eg. data["qn_index"] as int
- SizedBox (spacing)
- RoundedRectangleBorder
- SizedBox + SingleChildScrollView (for scrollable window, ensure all on screen is scrollable, physics: BouncingScrollPhysics() for bouncy effect)
- DateTime, Category,
- IOS vs Android Dialog Responsiveness
- Portrait vs Landscape Orientation Responsiveness
- Futures (Promises), Async Await Eg. Adding item
- Theming (.copyWith(...), .of(context) from ThemeData)
- 3rd party (uuid (unique ids), intl (date formatter))
- showModalBottomSheet (Overlay), ScaffoldMessenger, SnackBar + SnackBarAction (Eg. Undo notification), AppBar (Row Toolbar at top), Chart
- Expanded (use when 2 nested widgets are unconstrained by space), CupertinoAlertDialog (IOS native), AlertDialog (Android), LayoutBuilder (constraints based on parent widget), DropdownButton, DropdownMenuItem, Navigator.push/pushReplacement/pop(context, {...}) (Add/Replace/Remove overlay (return to prev screen) & pass info along), TextField (input field)
- ListView.builder (Scrollable List, BUT only create when visible (scrolled into view) for performance), Dismissible
- FractionallySizedBox
- Enum
- ColorScheme.fromSeed(...), Brightness, WidgetsFlutterBinding, SystemChrome, DeviceOrientation, ThemeData, CardTheme, ElevatedButtonThemeData, AppBarTheme, CardTheme, ThemeMode
- MediaQuery (Eg. Keyboard overlap bottom), TextEditingController (manage memory storage of input field, .text, .dispose/clear()), Platform.is..., TextInputType (Keyboard type for email/numbers)
- ValueKey
- late
- Cross-widget/App-wide state
- Explicit, Implicit Animations
- 3rd party (riverpod (Manage cross-widget state instead of passing states thru widgets that don't use it))
- Drawer (Hamburger icon Sidebar)
- BottomNavigationBar (Tab bar at bottom), BottomNavigationBarItem
- Card, GestureDetector (Screen actions Eg. make tappable, drag), InkWell(GestureDetector + give visual feedback), Stack(Eg. text (child) on image (parent), starting with bottom (most background) layer), Hero (Animate widget across diff screens, need to be tagged same for connection), Positioned ( how child should be positioned RELATIVE to parent on stack)
- ListTile (Outputting any type List as a row)
- SwitchListTile (Row of switches), AnimatedSwitcher, GridView (similar to ListView, but grids)
- ProviderScope
- ConsumerStatefulWidget + ConsumerState, ref.watch(PROVIDER) (read again whenever value changes, like JS hooks), ref.read(PROVIDER.notifier)... (read once), StateNotifier(.state holds data, BUT cannot modify (.add/.remove) regardless, MUST alw create new data), StateNotifierProvider
- FadeInImage (Fade in instead of popping in animation), MemoryImage (Image loaded from memory), NetworkImage (Image loaded from internet), BoxFit.cover (If image is too big to fit, it is cut off and zoomed in, not distorted), TextOverflow (What to replace with if text overflows, Eg. .ellipsis)
- WillPopScope (Detected when user taps back button (device/app))
- MaterialPageRoute (Route into another screen), Rotation/SlideTransition (transition animation), Tween, AnimationController (late, .forward/.stop/.repeat, .dispose(), .value), AnimatedBuilder (Listen to animation), SliverGridDelegateWithFixedCrossAxisCount (Set no. of columns for GridView), CurvedAnimation (Non-linear animation)
- Form
- Backend & HTTP requests
- json.decode/encode
- !context.mounted (Check if referred context is outdated)
- 3rd party (http.get/post/put/patch/delete(...))
- CircularProgressIndicator (loading spinner), FutureBuilder (Updating UI based on state of Future)
- TextFormField/DropdownButtonFormField (TextField/DropdownButton for forms)
- Native Device Features (Camera, Device Storage, GPS location)
- Google Maps API
- Pathing + SQLite Database
- Firebase Auth, Firestore, Cloud Storage, Messaging
- StreamBuilder (Takes a Stream (continuous flow of data Eg. real-time updates), subscribes+rebuilds UI with specified widget whenever any changes to Stream)
- MaterialApp(debugShowCheckedModeBanner: false) (Not show "debug" banner on emulator)
- Get/Add/Update/Delete data: .then, Retrieve + use to build widget: FutureBuilder/StreamBuilder
- TabController (addListener if _tabController.index not updating in TabBarView for some reason), TabBar, TabBarView (for diff tabs)
- LinearProgressIndicator (Progress bar)
- ScrollablePositionedList (Scrollable list, navigate to clicked)
- GestureDetector(onVerticalDragUpdate: (details) { if (details.delta.dy < -5) {..}}) (Action on swipe-up)
- VideoPlayerController, ChewieController
- Scaffold(extendBodyBehindAppBar: true) (Image behind Scaffold, esp Appbar part), BottomNavigationBar (Bottom tabs)
- Divider (Like Container(color: ...))
- BoxDecoration (Border/OutlineInputBorder, BorderRadius, clipBehavior, BoxShadow), InputDecoration (To decorate TextField input)
- FocusScope.of(context).requestFocus(FocusNode()) + FocusScope.of(context).unfocus() (Close keyboard Eg. when tapping out of focus areas)