SlideShare a Scribd company logo
Flutter Forward
Workshop
.
Introduction
Flutter Forward is an annual event hosted by Google's Flutter team that brings
together developers, designers, and enthusiasts to learn about the latest
advancements and best practices in building mobile and web applications with
Flutter.
Flutter Forward Event
• Flutter Forward Website
https://flutter.dev/events/flutter-forward
• 2023 Flutter Forward Event Livestream:
https://www.youtube.com/watch?v=zKQYGKAe5W8
Introduction
Flutter Forward Event
Introduction
Flutter
● Flutter is a free and open-source user interface (UI) software
development kit (SDK) that was developed by Google.
● It enables developers to create high-quality, cross-platform applications
for a range of operating systems including Android, iOS, Linux, macOS,
Windows, and the web using a single codebase.
● One codebase for all platforms
● “It’s all Widgets” principle offers countless possibilities
● Rich libraries
● Flutter is fast
● Flutter is beautiful
Introduction
Why Flutter?
Flutter architecture
Dart App:
Composes widgets into the desired UI.
Implements business logic.
Owned by app developer.
Framework (source code)
Provides higher-level API to build high-
quality apps (for example, widgets, hit-
testing, gesture detection, accessibility, text
input).
Composites the app’s widget tree into a
scene.
Engine (source code)
Responsible for rasterizing composited scenes.
Provides low-level implementation of Flutter’s core APIs (for example, graphics,
text layout, Dart runtime).
Exposes its functionality to the framework using the dart:ui API.
Integrates with a specific platform using the Engine’s Embedder API.
Embedder (source code)
Coordinates with the underlying operating system for access to services like
rendering surfaces, accessibility, and input.
Manages the event loop.
Exposes platform-specific API to integrate the Embedder into apps.
Flutter architecture
Runner
Composes the pieces exposed by the platform-specific API of the Embedder into
an app package runnable on the target platform.
Part of app template generated by flutter create, owned by app developer.
Flutter architecture
● Dart is a programming language developed by Google.
● The programming language is designed for client development such as for
the web and mobile apps, and it can also be used to build server and
desktop applications.
● Dart also forms the foundation of Flutter. Dart provides the language and
runtimes that power Flutter apps, but Dart also supports many core
developer tasks like formatting, analyzing, and testing code.
Dart
Programming language
It can be compiled to multiple targets like
● ARM64 machine code for iOS and android
● JavaScript for web browsers
● .exe for Windows, MacOS and Linux
Dart
Programming language
void main() {
print('Hello, World!');
}
main is the function which first gets executed!
Dart Basics
Hello World
var name = ‘Dart';
var year = 1977;
var value = 3.7;
You can declare most variables without explicitly
specifying their type using var.A variable is “a named
space in the memory” that stores values. In other words,
it acts a container for values in a program. Variable
names are called identifiers.
Variables and Data types
var
int lineCount = 0;
Data types
Numbers
double
double value = 10.09;
int
Numbers in Dart are used to represent numeric literals.
bool check = true;
Data types
String
Boolean
String workshop = “flutter”; OR ‘flutter’;
var lst = new List(3);
lst[0] = 12;
lst[1] = 13;
lst[2] = 11;
var num_list = [1,2,3];
var lst = new List();
lst.add(12);
lst.add(13);
Data types:
list
Dart represents arrays in the form of List
objects. A List is simply an ordered
group of objects
Fixed Length
Dynamic Length
1)
var details = {'Usrname':’Flutter', ‘Password’: ‘admin@123’};
2)
var details = new Map();
details['Usrname'] = 'admin';
details['Password'] = 'admin@123';
Data types:
Map
The Map object is a simple key/value
pair.
if (value>10) {
print(‘Value is greater than 10');
} else if (value<0) {
print(‘value is less than 0');
}
.
Decision Making Statements : If-else
void main() {
var grade = "A";
switch(grade) {
case "A": { print("Excellent"); }
break;
case "B": { print("Good"); }
break;
case "C": { print("Fair");}
.
Decision Making Statements : Switch
break;
case "D": { print("Poor"); }
break;
default: { print("Invalid choice");
}
break;
}
}
for (int month = 1; month <= 12; month++) {
print(month);
}
while (year < 2016) {
year += 1;
}
.
Looping Statements : while and for
for (final i in Objects) {
print(i);
}
var n = 10;
do {
print(n);
n--;
}
while(n>=0);
.
Looping Statements : for in and do while
Dart comments usually start with //.
// This is a normal, one-line comment.
/* Comments like these are also
supported. */
Dart Comments:
// Importing core libraries
import 'dart:math';
// Importing libraries from external
packages
import 'package:test/test.dart';
// Importing files
import 'path/to/my_other_file.dart';
Imports:
1)Defining function
void function_name() {
//statements
}
1)Calling function
function_name();
Functions:
3) Returning Functions
return_type function_name(){
//statements
return value;
}
4) Parameterized Functions
Function_name(data_type param_1, data_type param_2[…]) {
//statements
}
Functions:
Optional Positional Parameters:
To specify optional positional parameters, use square [] brackets. If an
optional parameter is not passed a value, it is set to NULL.
Syntax: void function_name(param1, [optional_param_1]) { }
eg:
void main() {
test_param(123);
}
test_param(n1,[s1]) {
print(n1);
print(s1);
}
Functions:
Output??
Optional Named Parameters:
The parameters’ name must be specified while the value is being
passed. Curly brace {} can be used to specify optional named
parameters.
Syntax: void function_name(param1, {optional_param_1}) { }
Eg: void main() {
test_param(123);
test_param(123,s1:'hello');
}
test_param(n1,{s1}) {
print(n1);
print(s1);
}
Functions:
Output
?
Optional Parameters with Default values:
Function parameters can also be assigned values by default. However,
such parameters can also be explicitly passed values..
Syntax: void function_name(param1, {param2 = default_value}) { }
Eg: void main() {
test_param(123);
}
void test_param(n1,{s1:1}) {
print(n1);
print(s1);
}
Functions:
Output
?
To raise an exception, use throw:
void test_age(int age) {
if(age<0) {
throw new FormatException();
}
}
Exceptions:
throw:
To catch an exception, use a try statement with catch (or both):
try {
// code that might throw an exception
}
catch Exception2 {
// code for handling exception
}
Exceptions:
try catch:
Exceptions:
try catch:
void main() {
String message = "Hello";
try {
print("The character at the position 5 is ${message[5]}.");
} catch (e) {
print(e);
}
print('Bye!');
}
const String greet1 = “Hello”;
const greet2 = “Heyy”;
print(greet1);
print(greet2);
print(geek2);
If we try to reassign the same variable then it will display error.
const keyword:
final String greet1 = “Hello”;
final greet2 = “Heyy”;
print(greet1);
print(greet2);
print(geek2);
If we try to reassign the same variable then it will display error.
final keyword:
The only difference between the final and const keyword is that final
is a runtime-constant, which in turn means that its value can be
assigned at runtime instead of the compile-time that we had for the
const keyword.
final - runtime constant -> its value can be assigned at runtime
const - compile time constant -> its value is assigned at compile-time
const vs final:
Synchronous Language:
Asynchronous Language:
import 'dart:io';
void main() {
task1();
task2();
task3();
}
void task1() {
print('Task1 Complete');
}
void task2() {
print('Task2 Complete');
}
void task3() {
print('Task3 Complete');
}
import 'dart:io';
void main() {
task1();
task2();
task3();
}
void task1() {
print('Task1 Complete');
}
void task2() {
Duration FiveSeconds =
Duration(seconds: 5);
sleep(FiveSeconds);
print('Task2 Complete');
}
void task3() {
print('Task3 Complete');
}
import 'dart:io';
void main() {
task1();
task2();
task3();
}
void task1() {
print('Task1 Complete');
}
void task2() {
Duration FiveSeconds =
Duration(seconds: 5);
Future.delayed(FiveSeconds, () {
print('Task2 Complete');
});
}
void task3() {
print('Task3 Complete');}
import 'dart:io';
void main() {
task1();
String result = task2();
task3(result);
}
void task1() {
print('Task1 Complete');
}
String task2() {
Duration FiveSeconds = Duration(seconds: 5);
String value = 'task2';
Future.delayed(FiveSeconds, () {
value = 'Task2 Completed!';
print(value);
});
return value;
}
void task3(String value) {
print('Task3 Complete and $value');
}
import 'dart:io';
void main() async {
task1();
String result = await task2();
task3(result);
}
void task1() {
print('Task1 Complete');
}
Future<String> task2() async {
Duration FiveSeconds = Duration(seconds: 5);
String value = 'task2';
await Future.delayed(FiveSeconds, () {
value = 'Task2 Completed!';
print(value);
});
return value;
}
void task3(String value) {
print('Task3 Complete and $value');
}
Asynchronous Language:
Asynchronous operations let your program complete work
while waiting for another operation to finish. Here
are some common asynchronous operations:
● Fetching data over a network.
● Writing to a database.
● Reading data from a file.
● Null safety means that a variable cannot have a null
or void value.
● This feature improves user satisfaction by reducing
errors and app crashes.
● Null safety ensures that all runtime null-dereference
problems are shown at compile-time.
Null Safety
● Non-nullable: Variables by default cannot be null.
● Adoptable: It is entirely up to you to make the switch
to null safety.
● Fully Sound: All variables that require values must be
initialized appropriately.
Principles of Null Safety in
Dart
Nullable types (?):
If you want a variable of some datatype to accept any
object of that type or the value null, give the variable a
nullable type by adding a question mark (?) after the type
name. For example, a variable of type String? can contain
a string, or it can be null.
Syntax:
datatype? var_name …
Null Safety in Dart
Non nullable variable
void main() {
int a;
a = null;
print('a is $a.');
}
Nullable variable
void main() {
int? a;
a = null;
print('a is $a.');
}
Error: The value 'null' can't be assigned to a variable of
type 'int' because 'int' is not nullable.
a = null;
^
Error: Compilation failed.
Output:
a is null.
The null assertion operator (!):
If you’re sure that an expression with a nullable type isn’t
null, you can use a null assertion operator (!) to make Dart
treat it as non-nullable. By adding ! just after the
expression, you tell Dart that the value won’t be null, and
that it’s safe to assign it to a non-nullable variable.
Syntax:
var_name!
Null Safety in Dart
void main() {
String? a = getValue();
int b = a.length;
print('b is ${b}.');
}
String? getValue() {
return "GDSC"; //We know this cannot be null
}
void main() {
String? a = getValue();
int b = a!.length;
print('b is ${b}.');
}
String? getValue() {
return "GDSC"; //We know this cannot be null
}
Output:
b is 4.
Error: Property 'length' cannot be accessed on 'String?'
because it is potentially null.
int b = a.length;
^^^^^^
Error: Compilation failed.
void main() {
int? a;
a = 100;
print('a is $a!.');
}
void main() {
int? a;
a = null;
print('a is $a!.');
}
Output:
a is 100.
Uncaught TypeError: Cannot read properties of null
(reading 'toString')Error: TypeError: Cannot read
properties of null (reading 'toString')
Null-aware operators (?. or ??):
To handle potentially you can instead use the conditional
property access operator (?.) or null-coalescing
operators (??) to conditionally access a property or
provide a default value if null respectively.
Syntax:
nullableObject?.action();
nullableString ??= 'alternate';
variable = nullableString ?? 'alternate'
Null Safety in Dart
void main() {
String? a = null;
int? b = a.length;
print('b is ${b}.');
}
void main() {
String? a = null;
int? b = a?.length;
print('b is ${b}.');
}
Output:
b is null.
Error: Property 'length' cannot be accessed on
'String?' because it is potentially null.
int? b = a.length;
^^^^^^
Error: Compilation failed.
void main() {
String? a = null;
String b = (a != null) ? a : 'GDSC';
print('b is ${b}.');
}
void main() {
String? a = null;
String b = a ?? 'GDSC';
print('b is ${b}.');
}
Output:
b is GDSC.
Late keyword:
Sometimes variables—fields in a class, or top-level
variables—should be non-nullable, but they can’t be
assigned a value immediately. For cases like that, use the
late keyword.
Syntax:
late datatype var_name;
Null Safety in Dart
Basic object oriented programming
Type of computer programming
in which the objects and
their interactions with one
another are considered
central.
It is based on the concept
that all items in a program
such as variables, data
structures, and functions
should be treated as
objects.
OOPs Concepts
A class is a template for creating objects. It defines the
data and behavior that all objects of that type will
share. In object-oriented programming, you create classes
by defining a set of attributes and methods. It is a user
defined Data type.
Class
Object
In object-oriented programming, you instantiate a class by
creating an object. An object can be thought of as a
particular instance of a class. It contains its own copy
of each property defined in the class, and each method is
executed independently on that object.
Methods are useful for re-usability or keeping functionality
encapsulated inside one object at a time.
In dart to create a class you need to use the class keyword
followed by the name of the class and then open and close
curly braces.
class Car {
// attributes
String? color;
int? width;
int? petrol;
// methods
void drive()
{
print("OK");
}
}
void main() {
// constructor
final maruti = Car();
// accessing class attributes & methods
Using the dot operator “.”
maruti.color = "White";
maruti.width = 80;
maruti.petrol = 90;
maruti.drive();
}
Creating objects
We can create an object of a defined class using one of its
constructors.
The Constructor is the first thing that is called when you
construct any Object from the Class
Important Properties of Constructor:
● The Constructor name should same as the Class Name.
● The Constructor doesn't return anything. It doesn't have
any return type.
● The Constructor is called only once in its lifetime,
which is when the Object is created.
Types of constructors
1.Default Constructor: A Constructor which has no parameter is
called a default constructor or no-arg constructor. If we
don't define it in the class, the Dart compiler will
automatically generate it.
1.Parameterized Constructor: When you pass some
parameters/arguments to the constructor, it is called a
Parameterized Constructor. This type of constructor is
usually used when you want to initialize the properties of
an object.
1.Named Constructor: Sometimes we need more than one
constructor to perform different functionalities. But you
can't create multiple constructors with the same name. To
overcome this problem, dart allows the user to make multiple
constructors with a different names.
It is a set of rules and definitions that allows one to
understand a topic or issue without actually knowing about
it in person or how it was developed.
Pillars of OOPs
Abstraction
An Abstract class in Dart is defined as those classes which
contain one or more than one abstract method (methods
without implementation) in them. To declare an abstract
class we make use of the abstract keyword.
A class declared as abstract can’t be instantiated.
An abstract class can be extended, but if you inherit an
abstract class then you have to make sure that all the
abstract methods in it are provided with implementation.
Inheritance
Allows one class, called the base or superclass, to be inherited
by another class, called the derived or child class. The child
class then gains all the members of the superclass, including
data and behavior, unless they are overridden in the class. This
allows for code reuse and a more concise way of developing
software. The super keyword is used to refer to immediate parent
of a class.
Polymorphism
It is the ability of an object to take on different forms or
be polymorphic. This is usually achieved through inheritance,
where the child class can redefine the behavior of the members
inherited from the superclass. Polymorphism allows for more
flexible code and a greater degree of abstraction.
If a class has multiple methods
having the same name but different
parameters, It is known as method
overloading.
If subclass (child class) has
the same method as declared in
the parent class, it is known
as method overriding.
Method Overloading
Encapsulation
The process of combining data and behavior together into a
single unit is called an object. The data and behavior
should be made hidden from the other objects and the
developer. The object can then be assigned to a variable
that can be passed around as if it is an element of code.
To make any variable or function private, we just
need to append _ (Underscore) at the starting of
the variable name (ex: _variableName).
Why Flutter?
Using a single platform-agnostic codebase, Flutter
helps developers build high-performance, scalable
applications with attractive and functional user
interfaces for Android or iOS. Flutter relies on a
library of pre-made widgets that make it simple
for even people with limited programming or
development experience to launch their own mobile
applications quickly.
Flutter Introduction
●Flutter is a newer framework compared to any other
development platform present at the moment.
●Flutter can be used to create apps using the Material
UI, a beautiful open-source UI component library
developed by Google.
●Flutter provides quick and handy features like Hot
Reload and Hot Restart, which you’ll be using quite
much later on in the workshop.
●Extensive community support and ready bug fixes
available.
More Reasons to Use Flutter
Let’s take a simple
Flutter code for a
basic demo page.
A basic Hello World!
Output code in
flutter looks like
this:
You’ll be learning
each of these widgets
and attributes
throughout the
session!
ANDROID OUTPUT iOS OUTPUT
Web OUTPUT
Widgets
“Everything is a Widget in Flutter!”
Flutter widgets are built using a modern
framework that takes inspiration from
React. The central idea is that you build
your UI out of widgets. Widgets describe
what their view should look like given
their current configuration and state.
Basic widgets in Flutter
Material Components
Flutter provides a number of widgets that
help you build apps that follow Material
Design. A Material app starts with the
MaterialApp widget.
Scaffold is a class in flutter which provides
many widgets or we can say APIs like
Drawer, Snack-Bar, Bottom-Navigation-Bar,
Floating-Action-Button, App-Bar, etc.
Scaffold will expand or occupy the whole
device screen. It will occupy the available
space. Scaffold will provide a framework to
implement the basic material design layout
of the application.
The two main properties of Scaffold are:
AppBar and body.
Scaffold
AppBar is he topmost component of the app which
contains the toolbar and some other common action
buttons. As all the components in a flutter application
are a widget or a combination of widgets. So AppBar
is also a built-in class or widget in flutter which gives
the functionality of the AppBar out of the box
AppBar
● title: This property usually takes in the main widget as a parameter to be
displayed in the AppBar.
● backgroundColor: This property is used to add colors to the background of the
Appbar.
● elevation: This property is used to set the z-coordinate at which to place this app
bar relative to its parent.
● shape: This property is used to give shape to the Appbar and manage its shadow.
Properties of AppBar Widget
Container class in flutter is a convenience
widget that combines common painting,
positioning, and sizing of widgets. A Container
class can be used to store one or more widgets
and position them on the screen according to
our convenience. Basically, a container is like a
box to store contents. A basic container
element that stores a widget has a margin,
which separates the present container from
other contents.
Container
The fundamental properties of the Container Class are- child, color, height
and width, padding, alignment and Decoration.
Elevated Button
Elevated Button is a flutter component included inside
the material package i.e.
“package:flutter/material.dart“. The main
characteristic these buttons hold is the slight
elevation in their surface towards the screen on
getting tapped by the user. In simple language,
elevated buttons are un-deprecated raised buttons
with no explicitly defined button styling. Elevated
Buttons cannot be styled.
The parameters of Elevated button are:
1. child: this represents the button’s label.
2. onPressed: this represents the action to be
executed when the button is tapped
A TextField or TextBox is an input element which holds the alphanumeric
data, such as name, password, address, etc. It is a GUI control element that
enables the user to enter text information using a programmable code. It can
be of a single-line text field or multiple-line text field.
The common attributes of TextField in Flutter are:
● decoration: It is used to show the decoration around TextField.
● border: It is used to create a default rounded rectangle border around
TextField.
● labelText: It is used to show the label text on the selection of TextField.
● hintText: It is used to show the hint text inside TextField.
TextField
Row and Column are the two most important and
powerful widgets in Flutter. These widgets let you
align children horizontally and vertically as per
the requirement. As we know that when we
design any UI(User Interface) in a flutter, we need
to arrange its content in the Row and Column
manner so these Row and Column widgets are
required when designing UI.
Columns and Rows
● children: This property takes in List<Widget>, that is a list of widgets to display inside
the Row or the Column widget.
● crossAxisAlignment: The crossAxisAlignment takes in CrossAxisAlignment enum as the
object to how the children’s widgets should be placed in crossAxisAlignment. For Row
it is vertical and for Column it is horizontal.
● mainAxisAlignment: This property takes in MainAxisAlignment enum as the object to
decide how the children widgets should be placed in mainAxisAlignment. For Row it is
horizontal and for Column it is vertical.
● textDirection: This property controls the text direction of the Row or Column widget,
which can either be from left-to-right (by default) or right-to-left.
Properties of Row and Column Widget
This, as the name suggests, is used to add images in your application. A flutter app
when built has both assets (resources) and code. Assets are available and deployed
during runtime.
Syntax: Image.asset(‘image name’)
Asset Image
This is used to display images directly from the internet. To display
images from the internet, the Image.network() function is used.
Syntax: Image.network(source_url)
Network Image
So that was about the basic Widgets. Flutter
uses a variety of other Widgets and Classes to
build a complete and a beautiful application.
The application we will be making over the next
two days will involve many other widgets. You
can learn more about them and how to use them
here:
https://docs.flutter.dev/development/ui/widgets
Tree Structure
of App
The UI or display in Flutter comprises stacks of widgets popularly called a
widget tree.
The widget tree is constructed by the build method of the stateful or
stateless widget, and it is rebuilt whenever there is a change in the state
of the application.
Each widget tree has a root widget. This is the widget from which other
widgets are stacked upon.
Flutter Widget Tree
Everything in Flutter is a widget...
Flutter Widget Tree
● A typical widget tree
depicted using the Widget
Tree Inspector
● Selecting a widget shows
the properties and details of
the widget
Widget Inspector
BuildContext
BuildContext is a locator that is used to track
each widget in a tree and locate them and their
position in the tree.
Thus, every widget has its own BuildContext as
the location inside the widget tree is unique.
BuildContext
Some of the key methods of BuildContext in Flutter include:
inheritFromWidgetOfExactType: This method allows a widget to access the nearest widget of a
given type in the widget tree. It can be used to pass data down the widget tree hierarchy, such as
theme data or localization data.
findAncestorStateOfType: This method returns the state object of the nearest ancestor widget of
a given type. It can be used to access and modify the state of an ancestor widget from a
descendant widget.
findRenderObject: This method returns the RenderObject associated with the widget. A
RenderObject is a low-level object that represents the layout and rendering of a widget. It can be
used to perform custom layout and painting operations.
BuildContext is directly usable in every method of State class when using
StatefulWidget. However, if you are using a StatelessWidget, this is not
the case. You have to pass it down the tree you are building.
That’s because a StatelessWidget is immutable. Every member variable of
the class must be final and thus can not be altered after the object has
been constructed. The BuildContext, however, is known later, when the
build() method is called.
BuildContext
The build() method
The build() method is a required method that defines the
configuration of a widget.
Flutter maintains the current
state of the app at every given
time, so anytime we update the
User Interface we say that we
are updating the state.
Widgets and Classes
Every widget is implemented as a
Widget class in Flutter
The widget class hierarchy in Flutter is
very flexible, allowing to build complex
user interfaces by combining and
nesting different types of widgets.
Selecting the right folder structure for your
Flutter application
When building large Flutter apps, one of the first things
we should decide is how to structure our project.
This ensures that the entire team can follow a clear
convention and add features in a consistent manner.
File Structure
This is how a default folder
structure of Flutter app looks like.
Two Core Types of
Widgets
These two widgets are the building blocks of every
widget that flutter provides.
But before we get into what Stateless and Stateful is,
we need to understand what State is. The simplest
way to put it, State is something that can change within
a widget.
For example, let’s say we have a like button.
The button can either be filled in, or not
filled in depending on whether it has been
clicked. That’s a state right there. The state of
that button can either be filled in or not filled
in. If a widget is constant and does not
change no matter what is done, then it does
not have a State.
Stateless widgets are widgets that do not store any mutable state
within themselves. This means that every time the widget is rebuilt,
it will appear exactly the same as the previous time it was built.
Stateless widgets are usually simpler to implement and use fewer
resources.
Stateful widgets store mutable state within themselves. This means
that their appearance and behavior may change depending on the
values of the internal state. The state of a stateful widget can be
updated by calling setState() method, which rebuilds the widget and
updates its appearance.
Stateless and Stateful
widgets
Stateless widgets are like photographs that always look the
same. Every time you see the photo, it looks exactly as it did
before. Similarly, a stateless widget always looks the same
whenever it's displayed.
Stateful widgets are like a chameleon that can change its
appearance depending on the environment. Similarly, a
stateful widget can change its appearance and behavior
depending on the values of its internal state, which can be
updated by the application.
In much more Simpler
Ways..
class ItemCount extends StatelessWidget {
final String name;
final int count;
const ItemCount({super.key, required this.name, required this.count});
@override
Widget build(BuildContext context) {
return Text('$name: $count');
}
}
Stateless Widget
class ItemCount extends StatefulWidget {
final String name;
const ItemCount({super.key, required this.name});
@override
State<ItemCount> createState() => _ItemCountState();
}
class _ItemCountState extends State<ItemCount> {
int count = 1;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
setState(() {
count = count + 1;
});
},
child: Center(child: Text('${widget.name}: ${count}')));
}
}
Stateful Widget
Pub is the package manager for the Dart programming
language, containing reusable libraries & packages for
Flutter and general Dart programs.
Many developers around the world can contribute to
Flutter’s growth by writing packages and publishing
them at https://pub.dev. It’s a big public repository
where you can find packages for any platform (web,
mobile, or desktop)
Pub.dev

More Related Content

What's hot

What and Why Flutter? What is a Widget in Flutter?
What and Why Flutter? What is a Widget in Flutter?What and Why Flutter? What is a Widget in Flutter?
What and Why Flutter? What is a Widget in Flutter?
MohammadHussain595488
 
Flutter session 01
Flutter session 01Flutter session 01
Flutter session 01
DSC IEM
 
Flutter beyond hello world
Flutter beyond hello worldFlutter beyond hello world
Flutter beyond hello world
Ahmed Abu Eldahab
 
Introduction to Flutter - truly crossplatform, amazingly fast
Introduction to Flutter - truly crossplatform, amazingly fastIntroduction to Flutter - truly crossplatform, amazingly fast
Introduction to Flutter - truly crossplatform, amazingly fast
Bartosz Kosarzycki
 
Pune Flutter Presents - Flutter 101
Pune Flutter Presents - Flutter 101Pune Flutter Presents - Flutter 101
Pune Flutter Presents - Flutter 101
Arif Amirani
 
Flutter state management from zero to hero
Flutter state management from zero to heroFlutter state management from zero to hero
Flutter state management from zero to hero
Ahmed Abu Eldahab
 
What is flutter and why should i care?
What is flutter and why should i care?What is flutter and why should i care?
What is flutter and why should i care?
Sergi Martínez
 
Cross platform app development with flutter
Cross platform app development with flutterCross platform app development with flutter
Cross platform app development with flutter
Hwan Jo
 
Flutter introduction
Flutter introductionFlutter introduction
Flutter introduction
Võ Duy Tuấn
 
The magic of flutter
The magic of flutterThe magic of flutter
The magic of flutter
Shady Selim
 
Flutter
FlutterFlutter
Dart presentation
Dart presentationDart presentation
Dart presentation
Lucas Leal
 
Introduction to flutter
Introduction to flutter Introduction to flutter
Introduction to flutter
Wan Muzaffar Wan Hashim
 
Flutter State Management - Moti Bartov, Tikal
Flutter State Management - Moti Bartov, TikalFlutter State Management - Moti Bartov, Tikal
Flutter State Management - Moti Bartov, Tikal
DroidConTLV
 
Flutter festival - Write your first Flutter application
Flutter festival - Write your first Flutter applicationFlutter festival - Write your first Flutter application
Flutter festival - Write your first Flutter application
Apoorv Pandey
 
Flutter
FlutterFlutter
Developing Cross platform apps in flutter (Android, iOS, Web)
Developing Cross platform apps in flutter (Android, iOS, Web)Developing Cross platform apps in flutter (Android, iOS, Web)
Developing Cross platform apps in flutter (Android, iOS, Web)
Priyanka Tyagi
 
DSC IIITL Flutter Workshop
DSC IIITL Flutter WorkshopDSC IIITL Flutter Workshop
DSC IIITL Flutter Workshop
DSCIIITLucknow
 
Flutter: Future of App Development
Flutter: Future of App DevelopmentFlutter: Future of App Development
Flutter: Future of App Development
9 series
 
Flutter vs React Native | Edureka
Flutter vs React Native | EdurekaFlutter vs React Native | Edureka
Flutter vs React Native | Edureka
Edureka!
 

What's hot (20)

What and Why Flutter? What is a Widget in Flutter?
What and Why Flutter? What is a Widget in Flutter?What and Why Flutter? What is a Widget in Flutter?
What and Why Flutter? What is a Widget in Flutter?
 
Flutter session 01
Flutter session 01Flutter session 01
Flutter session 01
 
Flutter beyond hello world
Flutter beyond hello worldFlutter beyond hello world
Flutter beyond hello world
 
Introduction to Flutter - truly crossplatform, amazingly fast
Introduction to Flutter - truly crossplatform, amazingly fastIntroduction to Flutter - truly crossplatform, amazingly fast
Introduction to Flutter - truly crossplatform, amazingly fast
 
Pune Flutter Presents - Flutter 101
Pune Flutter Presents - Flutter 101Pune Flutter Presents - Flutter 101
Pune Flutter Presents - Flutter 101
 
Flutter state management from zero to hero
Flutter state management from zero to heroFlutter state management from zero to hero
Flutter state management from zero to hero
 
What is flutter and why should i care?
What is flutter and why should i care?What is flutter and why should i care?
What is flutter and why should i care?
 
Cross platform app development with flutter
Cross platform app development with flutterCross platform app development with flutter
Cross platform app development with flutter
 
Flutter introduction
Flutter introductionFlutter introduction
Flutter introduction
 
The magic of flutter
The magic of flutterThe magic of flutter
The magic of flutter
 
Flutter
FlutterFlutter
Flutter
 
Dart presentation
Dart presentationDart presentation
Dart presentation
 
Introduction to flutter
Introduction to flutter Introduction to flutter
Introduction to flutter
 
Flutter State Management - Moti Bartov, Tikal
Flutter State Management - Moti Bartov, TikalFlutter State Management - Moti Bartov, Tikal
Flutter State Management - Moti Bartov, Tikal
 
Flutter festival - Write your first Flutter application
Flutter festival - Write your first Flutter applicationFlutter festival - Write your first Flutter application
Flutter festival - Write your first Flutter application
 
Flutter
FlutterFlutter
Flutter
 
Developing Cross platform apps in flutter (Android, iOS, Web)
Developing Cross platform apps in flutter (Android, iOS, Web)Developing Cross platform apps in flutter (Android, iOS, Web)
Developing Cross platform apps in flutter (Android, iOS, Web)
 
DSC IIITL Flutter Workshop
DSC IIITL Flutter WorkshopDSC IIITL Flutter Workshop
DSC IIITL Flutter Workshop
 
Flutter: Future of App Development
Flutter: Future of App DevelopmentFlutter: Future of App Development
Flutter: Future of App Development
 
Flutter vs React Native | Edureka
Flutter vs React Native | EdurekaFlutter vs React Native | Edureka
Flutter vs React Native | Edureka
 

Similar to GDSC Flutter Forward Workshop.pptx

Rustlabs Quick Start
Rustlabs Quick StartRustlabs Quick Start
Rustlabs Quick Start
sangam biradar
 
オープンデータを使ったモバイルアプリ開発(応用編)
オープンデータを使ったモバイルアプリ開発(応用編)オープンデータを使ったモバイルアプリ開発(応用編)
オープンデータを使ったモバイルアプリ開発(応用編)
Takayuki Goto
 
Rust Workshop - NITC FOSSMEET 2017
Rust Workshop - NITC FOSSMEET 2017 Rust Workshop - NITC FOSSMEET 2017
Rust Workshop - NITC FOSSMEET 2017
pramode_ce
 
Dart structured web apps
Dart   structured web appsDart   structured web apps
Dart structured web apps
chrisbuckett
 
Dart, unicorns and rainbows
Dart, unicorns and rainbowsDart, unicorns and rainbows
Dart, unicorns and rainbows
chrisbuckett
 
golang_getting_started.pptx
golang_getting_started.pptxgolang_getting_started.pptx
golang_getting_started.pptx
Guy Komari
 
An imperative study of c
An imperative study of cAn imperative study of c
An imperative study of c
Tushar B Kute
 
Go 1.10 Release Party - PDX Go
Go 1.10 Release Party - PDX GoGo 1.10 Release Party - PDX Go
Go 1.10 Release Party - PDX Go
Rodolfo Carvalho
 
7 functions
7  functions7  functions
7 functions
MomenMostafa
 
TypeScript - All you ever wanted to know - Tech Talk by Epic Labs
TypeScript - All you ever wanted to know - Tech Talk by Epic LabsTypeScript - All you ever wanted to know - Tech Talk by Epic Labs
TypeScript - All you ever wanted to know - Tech Talk by Epic Labs
Alfonso Peletier
 
Introduction To Groovy 2005
Introduction To Groovy 2005Introduction To Groovy 2005
Introduction To Groovy 2005
Tugdual Grall
 
270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt
JoshCasas1
 
Flutter tutorial for Beginner Step by Step
Flutter tutorial for Beginner Step by StepFlutter tutorial for Beginner Step by Step
Flutter tutorial for Beginner Step by Step
Chandramouli Biyyala
 
Dart
DartDart
270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt
UdhayaKumar175069
 
Survey of programming language getting started in C
Survey of programming language getting started in CSurvey of programming language getting started in C
Survey of programming language getting started in C
ummeafruz
 
270 1 c_intro_up_to_functions
270 1 c_intro_up_to_functions270 1 c_intro_up_to_functions
270 1 c_intro_up_to_functions
ray143eddie
 
270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt
Alefya1
 

Similar to GDSC Flutter Forward Workshop.pptx (20)

Dartprogramming
DartprogrammingDartprogramming
Dartprogramming
 
Rustlabs Quick Start
Rustlabs Quick StartRustlabs Quick Start
Rustlabs Quick Start
 
オープンデータを使ったモバイルアプリ開発(応用編)
オープンデータを使ったモバイルアプリ開発(応用編)オープンデータを使ったモバイルアプリ開発(応用編)
オープンデータを使ったモバイルアプリ開発(応用編)
 
TechTalk - Dotnet
TechTalk - DotnetTechTalk - Dotnet
TechTalk - Dotnet
 
Rust Workshop - NITC FOSSMEET 2017
Rust Workshop - NITC FOSSMEET 2017 Rust Workshop - NITC FOSSMEET 2017
Rust Workshop - NITC FOSSMEET 2017
 
Dart structured web apps
Dart   structured web appsDart   structured web apps
Dart structured web apps
 
Dart, unicorns and rainbows
Dart, unicorns and rainbowsDart, unicorns and rainbows
Dart, unicorns and rainbows
 
golang_getting_started.pptx
golang_getting_started.pptxgolang_getting_started.pptx
golang_getting_started.pptx
 
An imperative study of c
An imperative study of cAn imperative study of c
An imperative study of c
 
Go 1.10 Release Party - PDX Go
Go 1.10 Release Party - PDX GoGo 1.10 Release Party - PDX Go
Go 1.10 Release Party - PDX Go
 
7 functions
7  functions7  functions
7 functions
 
TypeScript - All you ever wanted to know - Tech Talk by Epic Labs
TypeScript - All you ever wanted to know - Tech Talk by Epic LabsTypeScript - All you ever wanted to know - Tech Talk by Epic Labs
TypeScript - All you ever wanted to know - Tech Talk by Epic Labs
 
Introduction To Groovy 2005
Introduction To Groovy 2005Introduction To Groovy 2005
Introduction To Groovy 2005
 
270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt
 
Flutter tutorial for Beginner Step by Step
Flutter tutorial for Beginner Step by StepFlutter tutorial for Beginner Step by Step
Flutter tutorial for Beginner Step by Step
 
Dart
DartDart
Dart
 
270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt
 
Survey of programming language getting started in C
Survey of programming language getting started in CSurvey of programming language getting started in C
Survey of programming language getting started in C
 
270 1 c_intro_up_to_functions
270 1 c_intro_up_to_functions270 1 c_intro_up_to_functions
270 1 c_intro_up_to_functions
 
270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt270_1_CIntro_Up_To_Functions.ppt
270_1_CIntro_Up_To_Functions.ppt
 

More from GDSCVJTI

Firebase Introduction.pptx
Firebase Introduction.pptxFirebase Introduction.pptx
Firebase Introduction.pptx
GDSCVJTI
 
Kickstart ML.pptx
Kickstart ML.pptxKickstart ML.pptx
Kickstart ML.pptx
GDSCVJTI
 
Jetpack Compose.pptx
Jetpack Compose.pptxJetpack Compose.pptx
Jetpack Compose.pptx
GDSCVJTI
 
Kotlin Playground.pptx
Kotlin Playground.pptxKotlin Playground.pptx
Kotlin Playground.pptx
GDSCVJTI
 
GDSC FY Orientation.pptx
GDSC FY Orientation.pptxGDSC FY Orientation.pptx
GDSC FY Orientation.pptx
GDSCVJTI
 
Introduction to Google Cloud & GCCP Campaign
Introduction to Google Cloud & GCCP CampaignIntroduction to Google Cloud & GCCP Campaign
Introduction to Google Cloud & GCCP Campaign
GDSCVJTI
 
Introduction to Web Development.pptx
Introduction to Web Development.pptxIntroduction to Web Development.pptx
Introduction to Web Development.pptx
GDSCVJTI
 

More from GDSCVJTI (7)

Firebase Introduction.pptx
Firebase Introduction.pptxFirebase Introduction.pptx
Firebase Introduction.pptx
 
Kickstart ML.pptx
Kickstart ML.pptxKickstart ML.pptx
Kickstart ML.pptx
 
Jetpack Compose.pptx
Jetpack Compose.pptxJetpack Compose.pptx
Jetpack Compose.pptx
 
Kotlin Playground.pptx
Kotlin Playground.pptxKotlin Playground.pptx
Kotlin Playground.pptx
 
GDSC FY Orientation.pptx
GDSC FY Orientation.pptxGDSC FY Orientation.pptx
GDSC FY Orientation.pptx
 
Introduction to Google Cloud & GCCP Campaign
Introduction to Google Cloud & GCCP CampaignIntroduction to Google Cloud & GCCP Campaign
Introduction to Google Cloud & GCCP Campaign
 
Introduction to Web Development.pptx
Introduction to Web Development.pptxIntroduction to Web Development.pptx
Introduction to Web Development.pptx
 

Recently uploaded

Adversarial Attention Modeling for Multi-dimensional Emotion Regression.pdf
Adversarial Attention Modeling for Multi-dimensional Emotion Regression.pdfAdversarial Attention Modeling for Multi-dimensional Emotion Regression.pdf
Adversarial Attention Modeling for Multi-dimensional Emotion Regression.pdf
Po-Chuan Chen
 
Biological Screening of Herbal Drugs in detailed.
Biological Screening of Herbal Drugs in detailed.Biological Screening of Herbal Drugs in detailed.
Biological Screening of Herbal Drugs in detailed.
Ashokrao Mane college of Pharmacy Peth-Vadgaon
 
Supporting (UKRI) OA monographs at Salford.pptx
Supporting (UKRI) OA monographs at Salford.pptxSupporting (UKRI) OA monographs at Salford.pptx
Supporting (UKRI) OA monographs at Salford.pptx
Jisc
 
Embracing GenAI - A Strategic Imperative
Embracing GenAI - A Strategic ImperativeEmbracing GenAI - A Strategic Imperative
Embracing GenAI - A Strategic Imperative
Peter Windle
 
June 3, 2024 Anti-Semitism Letter Sent to MIT President Kornbluth and MIT Cor...
June 3, 2024 Anti-Semitism Letter Sent to MIT President Kornbluth and MIT Cor...June 3, 2024 Anti-Semitism Letter Sent to MIT President Kornbluth and MIT Cor...
June 3, 2024 Anti-Semitism Letter Sent to MIT President Kornbluth and MIT Cor...
Levi Shapiro
 
special B.ed 2nd year old paper_20240531.pdf
special B.ed 2nd year old paper_20240531.pdfspecial B.ed 2nd year old paper_20240531.pdf
special B.ed 2nd year old paper_20240531.pdf
Special education needs
 
A Strategic Approach: GenAI in Education
A Strategic Approach: GenAI in EducationA Strategic Approach: GenAI in Education
A Strategic Approach: GenAI in Education
Peter Windle
 
Language Across the Curriculm LAC B.Ed.
Language Across the  Curriculm LAC B.Ed.Language Across the  Curriculm LAC B.Ed.
Language Across the Curriculm LAC B.Ed.
Atul Kumar Singh
 
Welcome to TechSoup New Member Orientation and Q&A (May 2024).pdf
Welcome to TechSoup   New Member Orientation and Q&A (May 2024).pdfWelcome to TechSoup   New Member Orientation and Q&A (May 2024).pdf
Welcome to TechSoup New Member Orientation and Q&A (May 2024).pdf
TechSoup
 
Introduction to AI for Nonprofits with Tapp Network
Introduction to AI for Nonprofits with Tapp NetworkIntroduction to AI for Nonprofits with Tapp Network
Introduction to AI for Nonprofits with Tapp Network
TechSoup
 
The Roman Empire A Historical Colossus.pdf
The Roman Empire A Historical Colossus.pdfThe Roman Empire A Historical Colossus.pdf
The Roman Empire A Historical Colossus.pdf
kaushalkr1407
 
Digital Tools and AI for Teaching Learning and Research
Digital Tools and AI for Teaching Learning and ResearchDigital Tools and AI for Teaching Learning and Research
Digital Tools and AI for Teaching Learning and Research
Vikramjit Singh
 
Phrasal Verbs.XXXXXXXXXXXXXXXXXXXXXXXXXX
Phrasal Verbs.XXXXXXXXXXXXXXXXXXXXXXXXXXPhrasal Verbs.XXXXXXXXXXXXXXXXXXXXXXXXXX
Phrasal Verbs.XXXXXXXXXXXXXXXXXXXXXXXXXX
MIRIAMSALINAS13
 
The French Revolution Class 9 Study Material pdf free download
The French Revolution Class 9 Study Material pdf free downloadThe French Revolution Class 9 Study Material pdf free download
The French Revolution Class 9 Study Material pdf free download
Vivekanand Anglo Vedic Academy
 
CLASS 11 CBSE B.St Project AIDS TO TRADE - INSURANCE
CLASS 11 CBSE B.St Project AIDS TO TRADE - INSURANCECLASS 11 CBSE B.St Project AIDS TO TRADE - INSURANCE
CLASS 11 CBSE B.St Project AIDS TO TRADE - INSURANCE
BhavyaRajput3
 
Model Attribute Check Company Auto Property
Model Attribute  Check Company Auto PropertyModel Attribute  Check Company Auto Property
Model Attribute Check Company Auto Property
Celine George
 
CACJapan - GROUP Presentation 1- Wk 4.pdf
CACJapan - GROUP Presentation 1- Wk 4.pdfCACJapan - GROUP Presentation 1- Wk 4.pdf
CACJapan - GROUP Presentation 1- Wk 4.pdf
camakaiclarkmusic
 
How to Make a Field invisible in Odoo 17
How to Make a Field invisible in Odoo 17How to Make a Field invisible in Odoo 17
How to Make a Field invisible in Odoo 17
Celine George
 
Overview on Edible Vaccine: Pros & Cons with Mechanism
Overview on Edible Vaccine: Pros & Cons with MechanismOverview on Edible Vaccine: Pros & Cons with Mechanism
Overview on Edible Vaccine: Pros & Cons with Mechanism
DeeptiGupta154
 
Palestine last event orientationfvgnh .pptx
Palestine last event orientationfvgnh .pptxPalestine last event orientationfvgnh .pptx
Palestine last event orientationfvgnh .pptx
RaedMohamed3
 

Recently uploaded (20)

Adversarial Attention Modeling for Multi-dimensional Emotion Regression.pdf
Adversarial Attention Modeling for Multi-dimensional Emotion Regression.pdfAdversarial Attention Modeling for Multi-dimensional Emotion Regression.pdf
Adversarial Attention Modeling for Multi-dimensional Emotion Regression.pdf
 
Biological Screening of Herbal Drugs in detailed.
Biological Screening of Herbal Drugs in detailed.Biological Screening of Herbal Drugs in detailed.
Biological Screening of Herbal Drugs in detailed.
 
Supporting (UKRI) OA monographs at Salford.pptx
Supporting (UKRI) OA monographs at Salford.pptxSupporting (UKRI) OA monographs at Salford.pptx
Supporting (UKRI) OA monographs at Salford.pptx
 
Embracing GenAI - A Strategic Imperative
Embracing GenAI - A Strategic ImperativeEmbracing GenAI - A Strategic Imperative
Embracing GenAI - A Strategic Imperative
 
June 3, 2024 Anti-Semitism Letter Sent to MIT President Kornbluth and MIT Cor...
June 3, 2024 Anti-Semitism Letter Sent to MIT President Kornbluth and MIT Cor...June 3, 2024 Anti-Semitism Letter Sent to MIT President Kornbluth and MIT Cor...
June 3, 2024 Anti-Semitism Letter Sent to MIT President Kornbluth and MIT Cor...
 
special B.ed 2nd year old paper_20240531.pdf
special B.ed 2nd year old paper_20240531.pdfspecial B.ed 2nd year old paper_20240531.pdf
special B.ed 2nd year old paper_20240531.pdf
 
A Strategic Approach: GenAI in Education
A Strategic Approach: GenAI in EducationA Strategic Approach: GenAI in Education
A Strategic Approach: GenAI in Education
 
Language Across the Curriculm LAC B.Ed.
Language Across the  Curriculm LAC B.Ed.Language Across the  Curriculm LAC B.Ed.
Language Across the Curriculm LAC B.Ed.
 
Welcome to TechSoup New Member Orientation and Q&A (May 2024).pdf
Welcome to TechSoup   New Member Orientation and Q&A (May 2024).pdfWelcome to TechSoup   New Member Orientation and Q&A (May 2024).pdf
Welcome to TechSoup New Member Orientation and Q&A (May 2024).pdf
 
Introduction to AI for Nonprofits with Tapp Network
Introduction to AI for Nonprofits with Tapp NetworkIntroduction to AI for Nonprofits with Tapp Network
Introduction to AI for Nonprofits with Tapp Network
 
The Roman Empire A Historical Colossus.pdf
The Roman Empire A Historical Colossus.pdfThe Roman Empire A Historical Colossus.pdf
The Roman Empire A Historical Colossus.pdf
 
Digital Tools and AI for Teaching Learning and Research
Digital Tools and AI for Teaching Learning and ResearchDigital Tools and AI for Teaching Learning and Research
Digital Tools and AI for Teaching Learning and Research
 
Phrasal Verbs.XXXXXXXXXXXXXXXXXXXXXXXXXX
Phrasal Verbs.XXXXXXXXXXXXXXXXXXXXXXXXXXPhrasal Verbs.XXXXXXXXXXXXXXXXXXXXXXXXXX
Phrasal Verbs.XXXXXXXXXXXXXXXXXXXXXXXXXX
 
The French Revolution Class 9 Study Material pdf free download
The French Revolution Class 9 Study Material pdf free downloadThe French Revolution Class 9 Study Material pdf free download
The French Revolution Class 9 Study Material pdf free download
 
CLASS 11 CBSE B.St Project AIDS TO TRADE - INSURANCE
CLASS 11 CBSE B.St Project AIDS TO TRADE - INSURANCECLASS 11 CBSE B.St Project AIDS TO TRADE - INSURANCE
CLASS 11 CBSE B.St Project AIDS TO TRADE - INSURANCE
 
Model Attribute Check Company Auto Property
Model Attribute  Check Company Auto PropertyModel Attribute  Check Company Auto Property
Model Attribute Check Company Auto Property
 
CACJapan - GROUP Presentation 1- Wk 4.pdf
CACJapan - GROUP Presentation 1- Wk 4.pdfCACJapan - GROUP Presentation 1- Wk 4.pdf
CACJapan - GROUP Presentation 1- Wk 4.pdf
 
How to Make a Field invisible in Odoo 17
How to Make a Field invisible in Odoo 17How to Make a Field invisible in Odoo 17
How to Make a Field invisible in Odoo 17
 
Overview on Edible Vaccine: Pros & Cons with Mechanism
Overview on Edible Vaccine: Pros & Cons with MechanismOverview on Edible Vaccine: Pros & Cons with Mechanism
Overview on Edible Vaccine: Pros & Cons with Mechanism
 
Palestine last event orientationfvgnh .pptx
Palestine last event orientationfvgnh .pptxPalestine last event orientationfvgnh .pptx
Palestine last event orientationfvgnh .pptx
 

GDSC Flutter Forward Workshop.pptx

  • 2. Introduction Flutter Forward is an annual event hosted by Google's Flutter team that brings together developers, designers, and enthusiasts to learn about the latest advancements and best practices in building mobile and web applications with Flutter. Flutter Forward Event
  • 3. • Flutter Forward Website https://flutter.dev/events/flutter-forward • 2023 Flutter Forward Event Livestream: https://www.youtube.com/watch?v=zKQYGKAe5W8 Introduction Flutter Forward Event
  • 4. Introduction Flutter ● Flutter is a free and open-source user interface (UI) software development kit (SDK) that was developed by Google. ● It enables developers to create high-quality, cross-platform applications for a range of operating systems including Android, iOS, Linux, macOS, Windows, and the web using a single codebase.
  • 5. ● One codebase for all platforms ● “It’s all Widgets” principle offers countless possibilities ● Rich libraries ● Flutter is fast ● Flutter is beautiful Introduction Why Flutter?
  • 6. Flutter architecture Dart App: Composes widgets into the desired UI. Implements business logic. Owned by app developer. Framework (source code) Provides higher-level API to build high- quality apps (for example, widgets, hit- testing, gesture detection, accessibility, text input). Composites the app’s widget tree into a scene.
  • 7. Engine (source code) Responsible for rasterizing composited scenes. Provides low-level implementation of Flutter’s core APIs (for example, graphics, text layout, Dart runtime). Exposes its functionality to the framework using the dart:ui API. Integrates with a specific platform using the Engine’s Embedder API. Embedder (source code) Coordinates with the underlying operating system for access to services like rendering surfaces, accessibility, and input. Manages the event loop. Exposes platform-specific API to integrate the Embedder into apps. Flutter architecture
  • 8. Runner Composes the pieces exposed by the platform-specific API of the Embedder into an app package runnable on the target platform. Part of app template generated by flutter create, owned by app developer. Flutter architecture
  • 9. ● Dart is a programming language developed by Google. ● The programming language is designed for client development such as for the web and mobile apps, and it can also be used to build server and desktop applications. ● Dart also forms the foundation of Flutter. Dart provides the language and runtimes that power Flutter apps, but Dart also supports many core developer tasks like formatting, analyzing, and testing code. Dart Programming language
  • 10. It can be compiled to multiple targets like ● ARM64 machine code for iOS and android ● JavaScript for web browsers ● .exe for Windows, MacOS and Linux Dart Programming language
  • 11. void main() { print('Hello, World!'); } main is the function which first gets executed! Dart Basics Hello World
  • 12. var name = ‘Dart'; var year = 1977; var value = 3.7; You can declare most variables without explicitly specifying their type using var.A variable is “a named space in the memory” that stores values. In other words, it acts a container for values in a program. Variable names are called identifiers. Variables and Data types var
  • 13. int lineCount = 0; Data types Numbers double double value = 10.09; int Numbers in Dart are used to represent numeric literals.
  • 14. bool check = true; Data types String Boolean String workshop = “flutter”; OR ‘flutter’;
  • 15. var lst = new List(3); lst[0] = 12; lst[1] = 13; lst[2] = 11; var num_list = [1,2,3]; var lst = new List(); lst.add(12); lst.add(13); Data types: list Dart represents arrays in the form of List objects. A List is simply an ordered group of objects Fixed Length Dynamic Length
  • 16. 1) var details = {'Usrname':’Flutter', ‘Password’: ‘admin@123’}; 2) var details = new Map(); details['Usrname'] = 'admin'; details['Password'] = 'admin@123'; Data types: Map The Map object is a simple key/value pair.
  • 17. if (value>10) { print(‘Value is greater than 10'); } else if (value<0) { print(‘value is less than 0'); } . Decision Making Statements : If-else
  • 18. void main() { var grade = "A"; switch(grade) { case "A": { print("Excellent"); } break; case "B": { print("Good"); } break; case "C": { print("Fair");} . Decision Making Statements : Switch break; case "D": { print("Poor"); } break; default: { print("Invalid choice"); } break; } }
  • 19. for (int month = 1; month <= 12; month++) { print(month); } while (year < 2016) { year += 1; } . Looping Statements : while and for
  • 20. for (final i in Objects) { print(i); } var n = 10; do { print(n); n--; } while(n>=0); . Looping Statements : for in and do while
  • 21. Dart comments usually start with //. // This is a normal, one-line comment. /* Comments like these are also supported. */ Dart Comments:
  • 22. // Importing core libraries import 'dart:math'; // Importing libraries from external packages import 'package:test/test.dart'; // Importing files import 'path/to/my_other_file.dart'; Imports:
  • 23. 1)Defining function void function_name() { //statements } 1)Calling function function_name(); Functions:
  • 24. 3) Returning Functions return_type function_name(){ //statements return value; } 4) Parameterized Functions Function_name(data_type param_1, data_type param_2[…]) { //statements } Functions:
  • 25. Optional Positional Parameters: To specify optional positional parameters, use square [] brackets. If an optional parameter is not passed a value, it is set to NULL. Syntax: void function_name(param1, [optional_param_1]) { } eg: void main() { test_param(123); } test_param(n1,[s1]) { print(n1); print(s1); } Functions: Output??
  • 26. Optional Named Parameters: The parameters’ name must be specified while the value is being passed. Curly brace {} can be used to specify optional named parameters. Syntax: void function_name(param1, {optional_param_1}) { } Eg: void main() { test_param(123); test_param(123,s1:'hello'); } test_param(n1,{s1}) { print(n1); print(s1); } Functions: Output ?
  • 27. Optional Parameters with Default values: Function parameters can also be assigned values by default. However, such parameters can also be explicitly passed values.. Syntax: void function_name(param1, {param2 = default_value}) { } Eg: void main() { test_param(123); } void test_param(n1,{s1:1}) { print(n1); print(s1); } Functions: Output ?
  • 28. To raise an exception, use throw: void test_age(int age) { if(age<0) { throw new FormatException(); } } Exceptions: throw:
  • 29. To catch an exception, use a try statement with catch (or both): try { // code that might throw an exception } catch Exception2 { // code for handling exception } Exceptions: try catch:
  • 30. Exceptions: try catch: void main() { String message = "Hello"; try { print("The character at the position 5 is ${message[5]}."); } catch (e) { print(e); } print('Bye!'); }
  • 31. const String greet1 = “Hello”; const greet2 = “Heyy”; print(greet1); print(greet2); print(geek2); If we try to reassign the same variable then it will display error. const keyword:
  • 32. final String greet1 = “Hello”; final greet2 = “Heyy”; print(greet1); print(greet2); print(geek2); If we try to reassign the same variable then it will display error. final keyword:
  • 33. The only difference between the final and const keyword is that final is a runtime-constant, which in turn means that its value can be assigned at runtime instead of the compile-time that we had for the const keyword. final - runtime constant -> its value can be assigned at runtime const - compile time constant -> its value is assigned at compile-time const vs final:
  • 36.
  • 37. import 'dart:io'; void main() { task1(); task2(); task3(); } void task1() { print('Task1 Complete'); } void task2() { print('Task2 Complete'); } void task3() { print('Task3 Complete'); }
  • 38. import 'dart:io'; void main() { task1(); task2(); task3(); } void task1() { print('Task1 Complete'); } void task2() { Duration FiveSeconds = Duration(seconds: 5); sleep(FiveSeconds); print('Task2 Complete'); } void task3() { print('Task3 Complete'); }
  • 39. import 'dart:io'; void main() { task1(); task2(); task3(); } void task1() { print('Task1 Complete'); } void task2() { Duration FiveSeconds = Duration(seconds: 5); Future.delayed(FiveSeconds, () { print('Task2 Complete'); }); } void task3() { print('Task3 Complete');}
  • 40. import 'dart:io'; void main() { task1(); String result = task2(); task3(result); } void task1() { print('Task1 Complete'); } String task2() { Duration FiveSeconds = Duration(seconds: 5); String value = 'task2'; Future.delayed(FiveSeconds, () { value = 'Task2 Completed!'; print(value); }); return value; } void task3(String value) { print('Task3 Complete and $value'); }
  • 41. import 'dart:io'; void main() async { task1(); String result = await task2(); task3(result); } void task1() { print('Task1 Complete'); } Future<String> task2() async { Duration FiveSeconds = Duration(seconds: 5); String value = 'task2'; await Future.delayed(FiveSeconds, () { value = 'Task2 Completed!'; print(value); }); return value; } void task3(String value) { print('Task3 Complete and $value'); }
  • 42. Asynchronous Language: Asynchronous operations let your program complete work while waiting for another operation to finish. Here are some common asynchronous operations: ● Fetching data over a network. ● Writing to a database. ● Reading data from a file.
  • 43. ● Null safety means that a variable cannot have a null or void value. ● This feature improves user satisfaction by reducing errors and app crashes. ● Null safety ensures that all runtime null-dereference problems are shown at compile-time. Null Safety
  • 44. ● Non-nullable: Variables by default cannot be null. ● Adoptable: It is entirely up to you to make the switch to null safety. ● Fully Sound: All variables that require values must be initialized appropriately. Principles of Null Safety in Dart
  • 45. Nullable types (?): If you want a variable of some datatype to accept any object of that type or the value null, give the variable a nullable type by adding a question mark (?) after the type name. For example, a variable of type String? can contain a string, or it can be null. Syntax: datatype? var_name … Null Safety in Dart
  • 46. Non nullable variable void main() { int a; a = null; print('a is $a.'); } Nullable variable void main() { int? a; a = null; print('a is $a.'); } Error: The value 'null' can't be assigned to a variable of type 'int' because 'int' is not nullable. a = null; ^ Error: Compilation failed. Output: a is null.
  • 47. The null assertion operator (!): If you’re sure that an expression with a nullable type isn’t null, you can use a null assertion operator (!) to make Dart treat it as non-nullable. By adding ! just after the expression, you tell Dart that the value won’t be null, and that it’s safe to assign it to a non-nullable variable. Syntax: var_name! Null Safety in Dart
  • 48. void main() { String? a = getValue(); int b = a.length; print('b is ${b}.'); } String? getValue() { return "GDSC"; //We know this cannot be null } void main() { String? a = getValue(); int b = a!.length; print('b is ${b}.'); } String? getValue() { return "GDSC"; //We know this cannot be null } Output: b is 4. Error: Property 'length' cannot be accessed on 'String?' because it is potentially null. int b = a.length; ^^^^^^ Error: Compilation failed.
  • 49. void main() { int? a; a = 100; print('a is $a!.'); } void main() { int? a; a = null; print('a is $a!.'); } Output: a is 100. Uncaught TypeError: Cannot read properties of null (reading 'toString')Error: TypeError: Cannot read properties of null (reading 'toString')
  • 50. Null-aware operators (?. or ??): To handle potentially you can instead use the conditional property access operator (?.) or null-coalescing operators (??) to conditionally access a property or provide a default value if null respectively. Syntax: nullableObject?.action(); nullableString ??= 'alternate'; variable = nullableString ?? 'alternate' Null Safety in Dart
  • 51. void main() { String? a = null; int? b = a.length; print('b is ${b}.'); } void main() { String? a = null; int? b = a?.length; print('b is ${b}.'); } Output: b is null. Error: Property 'length' cannot be accessed on 'String?' because it is potentially null. int? b = a.length; ^^^^^^ Error: Compilation failed.
  • 52. void main() { String? a = null; String b = (a != null) ? a : 'GDSC'; print('b is ${b}.'); } void main() { String? a = null; String b = a ?? 'GDSC'; print('b is ${b}.'); } Output: b is GDSC.
  • 53. Late keyword: Sometimes variables—fields in a class, or top-level variables—should be non-nullable, but they can’t be assigned a value immediately. For cases like that, use the late keyword. Syntax: late datatype var_name; Null Safety in Dart
  • 54. Basic object oriented programming Type of computer programming in which the objects and their interactions with one another are considered central. It is based on the concept that all items in a program such as variables, data structures, and functions should be treated as objects. OOPs Concepts
  • 55.
  • 56. A class is a template for creating objects. It defines the data and behavior that all objects of that type will share. In object-oriented programming, you create classes by defining a set of attributes and methods. It is a user defined Data type. Class Object In object-oriented programming, you instantiate a class by creating an object. An object can be thought of as a particular instance of a class. It contains its own copy of each property defined in the class, and each method is executed independently on that object.
  • 57. Methods are useful for re-usability or keeping functionality encapsulated inside one object at a time. In dart to create a class you need to use the class keyword followed by the name of the class and then open and close curly braces.
  • 58. class Car { // attributes String? color; int? width; int? petrol; // methods void drive() { print("OK"); } } void main() { // constructor final maruti = Car(); // accessing class attributes & methods Using the dot operator “.” maruti.color = "White"; maruti.width = 80; maruti.petrol = 90; maruti.drive(); }
  • 59. Creating objects We can create an object of a defined class using one of its constructors. The Constructor is the first thing that is called when you construct any Object from the Class Important Properties of Constructor: ● The Constructor name should same as the Class Name. ● The Constructor doesn't return anything. It doesn't have any return type. ● The Constructor is called only once in its lifetime, which is when the Object is created.
  • 60. Types of constructors 1.Default Constructor: A Constructor which has no parameter is called a default constructor or no-arg constructor. If we don't define it in the class, the Dart compiler will automatically generate it. 1.Parameterized Constructor: When you pass some parameters/arguments to the constructor, it is called a Parameterized Constructor. This type of constructor is usually used when you want to initialize the properties of an object. 1.Named Constructor: Sometimes we need more than one constructor to perform different functionalities. But you can't create multiple constructors with the same name. To overcome this problem, dart allows the user to make multiple constructors with a different names.
  • 61. It is a set of rules and definitions that allows one to understand a topic or issue without actually knowing about it in person or how it was developed. Pillars of OOPs Abstraction An Abstract class in Dart is defined as those classes which contain one or more than one abstract method (methods without implementation) in them. To declare an abstract class we make use of the abstract keyword. A class declared as abstract can’t be instantiated. An abstract class can be extended, but if you inherit an abstract class then you have to make sure that all the abstract methods in it are provided with implementation.
  • 62. Inheritance Allows one class, called the base or superclass, to be inherited by another class, called the derived or child class. The child class then gains all the members of the superclass, including data and behavior, unless they are overridden in the class. This allows for code reuse and a more concise way of developing software. The super keyword is used to refer to immediate parent of a class.
  • 63. Polymorphism It is the ability of an object to take on different forms or be polymorphic. This is usually achieved through inheritance, where the child class can redefine the behavior of the members inherited from the superclass. Polymorphism allows for more flexible code and a greater degree of abstraction. If a class has multiple methods having the same name but different parameters, It is known as method overloading. If subclass (child class) has the same method as declared in the parent class, it is known as method overriding. Method Overloading
  • 64. Encapsulation The process of combining data and behavior together into a single unit is called an object. The data and behavior should be made hidden from the other objects and the developer. The object can then be assigned to a variable that can be passed around as if it is an element of code. To make any variable or function private, we just need to append _ (Underscore) at the starting of the variable name (ex: _variableName).
  • 65. Why Flutter? Using a single platform-agnostic codebase, Flutter helps developers build high-performance, scalable applications with attractive and functional user interfaces for Android or iOS. Flutter relies on a library of pre-made widgets that make it simple for even people with limited programming or development experience to launch their own mobile applications quickly. Flutter Introduction
  • 66. ●Flutter is a newer framework compared to any other development platform present at the moment. ●Flutter can be used to create apps using the Material UI, a beautiful open-source UI component library developed by Google. ●Flutter provides quick and handy features like Hot Reload and Hot Restart, which you’ll be using quite much later on in the workshop. ●Extensive community support and ready bug fixes available. More Reasons to Use Flutter
  • 67. Let’s take a simple Flutter code for a basic demo page. A basic Hello World! Output code in flutter looks like this: You’ll be learning each of these widgets and attributes throughout the session!
  • 68. ANDROID OUTPUT iOS OUTPUT Web OUTPUT
  • 69.
  • 70. Widgets “Everything is a Widget in Flutter!” Flutter widgets are built using a modern framework that takes inspiration from React. The central idea is that you build your UI out of widgets. Widgets describe what their view should look like given their current configuration and state.
  • 71. Basic widgets in Flutter Material Components Flutter provides a number of widgets that help you build apps that follow Material Design. A Material app starts with the MaterialApp widget.
  • 72. Scaffold is a class in flutter which provides many widgets or we can say APIs like Drawer, Snack-Bar, Bottom-Navigation-Bar, Floating-Action-Button, App-Bar, etc. Scaffold will expand or occupy the whole device screen. It will occupy the available space. Scaffold will provide a framework to implement the basic material design layout of the application. The two main properties of Scaffold are: AppBar and body. Scaffold
  • 73. AppBar is he topmost component of the app which contains the toolbar and some other common action buttons. As all the components in a flutter application are a widget or a combination of widgets. So AppBar is also a built-in class or widget in flutter which gives the functionality of the AppBar out of the box AppBar
  • 74. ● title: This property usually takes in the main widget as a parameter to be displayed in the AppBar. ● backgroundColor: This property is used to add colors to the background of the Appbar. ● elevation: This property is used to set the z-coordinate at which to place this app bar relative to its parent. ● shape: This property is used to give shape to the Appbar and manage its shadow. Properties of AppBar Widget
  • 75. Container class in flutter is a convenience widget that combines common painting, positioning, and sizing of widgets. A Container class can be used to store one or more widgets and position them on the screen according to our convenience. Basically, a container is like a box to store contents. A basic container element that stores a widget has a margin, which separates the present container from other contents. Container The fundamental properties of the Container Class are- child, color, height and width, padding, alignment and Decoration.
  • 76. Elevated Button Elevated Button is a flutter component included inside the material package i.e. “package:flutter/material.dart“. The main characteristic these buttons hold is the slight elevation in their surface towards the screen on getting tapped by the user. In simple language, elevated buttons are un-deprecated raised buttons with no explicitly defined button styling. Elevated Buttons cannot be styled. The parameters of Elevated button are: 1. child: this represents the button’s label. 2. onPressed: this represents the action to be executed when the button is tapped
  • 77. A TextField or TextBox is an input element which holds the alphanumeric data, such as name, password, address, etc. It is a GUI control element that enables the user to enter text information using a programmable code. It can be of a single-line text field or multiple-line text field. The common attributes of TextField in Flutter are: ● decoration: It is used to show the decoration around TextField. ● border: It is used to create a default rounded rectangle border around TextField. ● labelText: It is used to show the label text on the selection of TextField. ● hintText: It is used to show the hint text inside TextField. TextField
  • 78. Row and Column are the two most important and powerful widgets in Flutter. These widgets let you align children horizontally and vertically as per the requirement. As we know that when we design any UI(User Interface) in a flutter, we need to arrange its content in the Row and Column manner so these Row and Column widgets are required when designing UI. Columns and Rows
  • 79. ● children: This property takes in List<Widget>, that is a list of widgets to display inside the Row or the Column widget. ● crossAxisAlignment: The crossAxisAlignment takes in CrossAxisAlignment enum as the object to how the children’s widgets should be placed in crossAxisAlignment. For Row it is vertical and for Column it is horizontal. ● mainAxisAlignment: This property takes in MainAxisAlignment enum as the object to decide how the children widgets should be placed in mainAxisAlignment. For Row it is horizontal and for Column it is vertical. ● textDirection: This property controls the text direction of the Row or Column widget, which can either be from left-to-right (by default) or right-to-left. Properties of Row and Column Widget
  • 80. This, as the name suggests, is used to add images in your application. A flutter app when built has both assets (resources) and code. Assets are available and deployed during runtime. Syntax: Image.asset(‘image name’) Asset Image This is used to display images directly from the internet. To display images from the internet, the Image.network() function is used. Syntax: Image.network(source_url) Network Image
  • 81.
  • 82. So that was about the basic Widgets. Flutter uses a variety of other Widgets and Classes to build a complete and a beautiful application. The application we will be making over the next two days will involve many other widgets. You can learn more about them and how to use them here: https://docs.flutter.dev/development/ui/widgets
  • 84. The UI or display in Flutter comprises stacks of widgets popularly called a widget tree. The widget tree is constructed by the build method of the stateful or stateless widget, and it is rebuilt whenever there is a change in the state of the application. Each widget tree has a root widget. This is the widget from which other widgets are stacked upon. Flutter Widget Tree Everything in Flutter is a widget...
  • 85.
  • 87. ● A typical widget tree depicted using the Widget Tree Inspector ● Selecting a widget shows the properties and details of the widget Widget Inspector
  • 88. BuildContext BuildContext is a locator that is used to track each widget in a tree and locate them and their position in the tree. Thus, every widget has its own BuildContext as the location inside the widget tree is unique.
  • 89. BuildContext Some of the key methods of BuildContext in Flutter include: inheritFromWidgetOfExactType: This method allows a widget to access the nearest widget of a given type in the widget tree. It can be used to pass data down the widget tree hierarchy, such as theme data or localization data. findAncestorStateOfType: This method returns the state object of the nearest ancestor widget of a given type. It can be used to access and modify the state of an ancestor widget from a descendant widget. findRenderObject: This method returns the RenderObject associated with the widget. A RenderObject is a low-level object that represents the layout and rendering of a widget. It can be used to perform custom layout and painting operations.
  • 90. BuildContext is directly usable in every method of State class when using StatefulWidget. However, if you are using a StatelessWidget, this is not the case. You have to pass it down the tree you are building. That’s because a StatelessWidget is immutable. Every member variable of the class must be final and thus can not be altered after the object has been constructed. The BuildContext, however, is known later, when the build() method is called. BuildContext
  • 91. The build() method The build() method is a required method that defines the configuration of a widget. Flutter maintains the current state of the app at every given time, so anytime we update the User Interface we say that we are updating the state.
  • 92. Widgets and Classes Every widget is implemented as a Widget class in Flutter The widget class hierarchy in Flutter is very flexible, allowing to build complex user interfaces by combining and nesting different types of widgets.
  • 93. Selecting the right folder structure for your Flutter application When building large Flutter apps, one of the first things we should decide is how to structure our project. This ensures that the entire team can follow a clear convention and add features in a consistent manner. File Structure
  • 94. This is how a default folder structure of Flutter app looks like.
  • 95. Two Core Types of Widgets
  • 96. These two widgets are the building blocks of every widget that flutter provides. But before we get into what Stateless and Stateful is, we need to understand what State is. The simplest way to put it, State is something that can change within a widget.
  • 97. For example, let’s say we have a like button. The button can either be filled in, or not filled in depending on whether it has been clicked. That’s a state right there. The state of that button can either be filled in or not filled in. If a widget is constant and does not change no matter what is done, then it does not have a State.
  • 98. Stateless widgets are widgets that do not store any mutable state within themselves. This means that every time the widget is rebuilt, it will appear exactly the same as the previous time it was built. Stateless widgets are usually simpler to implement and use fewer resources. Stateful widgets store mutable state within themselves. This means that their appearance and behavior may change depending on the values of the internal state. The state of a stateful widget can be updated by calling setState() method, which rebuilds the widget and updates its appearance. Stateless and Stateful widgets
  • 99. Stateless widgets are like photographs that always look the same. Every time you see the photo, it looks exactly as it did before. Similarly, a stateless widget always looks the same whenever it's displayed. Stateful widgets are like a chameleon that can change its appearance depending on the environment. Similarly, a stateful widget can change its appearance and behavior depending on the values of its internal state, which can be updated by the application. In much more Simpler Ways..
  • 100. class ItemCount extends StatelessWidget { final String name; final int count; const ItemCount({super.key, required this.name, required this.count}); @override Widget build(BuildContext context) { return Text('$name: $count'); } } Stateless Widget
  • 101. class ItemCount extends StatefulWidget { final String name; const ItemCount({super.key, required this.name}); @override State<ItemCount> createState() => _ItemCountState(); } class _ItemCountState extends State<ItemCount> { int count = 1; @override Widget build(BuildContext context) { return GestureDetector( onTap: () { setState(() { count = count + 1; }); }, child: Center(child: Text('${widget.name}: ${count}'))); } } Stateful Widget
  • 102. Pub is the package manager for the Dart programming language, containing reusable libraries & packages for Flutter and general Dart programs. Many developers around the world can contribute to Flutter’s growth by writing packages and publishing them at https://pub.dev. It’s a big public repository where you can find packages for any platform (web, mobile, or desktop) Pub.dev