Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
F
Flutter exercise sohaib
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Sohaib A. Y. Nassar
Flutter exercise sohaib
Commits
5e6e7f19
Commit
5e6e7f19
authored
May 16, 2022
by
sohanassa
Browse files
Options
Downloads
Patches
Plain Diff
creating the example
parent
536ccd8b
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
ex2/lib/main.dart
+64
-91
64 additions, 91 deletions
ex2/lib/main.dart
with
64 additions
and
91 deletions
ex2/lib/main.dart
+
64
−
91
View file @
5e6e7f19
import
'dart:async'
;
import
'dart:convert'
;
import
'package:flutter/material.dart'
;
import
'package:flutter/material.dart'
;
import
'package:http/http.dart'
;
import
'package:http/http.dart'
as
http
;
Future
<
Album
>
fetchAlbum
()
async
{
final
response
=
await
http
.
get
(
Uri
.
parse
(
'https://jsonplaceholder.typicode.com/albums/1'
));
void
main
()
{
if
(
response
.
statusCode
==
200
)
{
runApp
(
const
MyApp
());
// If the server did return a 200 OK response,
// then parse the JSON.
return
Album
.
fromJson
(
jsonDecode
(
response
.
body
));
}
else
{
// If the server did not return a 200 OK response,
// then throw an exception.
throw
Exception
(
'Failed to load album'
);
}
}
}
class
MyApp
extends
StatelessWidget
{
class
Album
{
const
MyApp
({
Key
?
key
})
:
super
(
key:
key
);
final
int
userId
;
final
int
id
;
final
String
title
;
// This widg et is the root of your application.
const
Album
({
@override
required
this
.
userId
,
Widget
build
(
BuildContext
context
)
{
required
this
.
id
,
return
MaterialApp
(
required
this
.
title
,
title:
'Flutter Demo'
,
});
theme:
ThemeData
(
// This is the theme of your application.
factory
Album
.
fromJson
(
Map
<
String
,
dynamic
>
json
)
{
//
return
Album
(
// Try running your application with "flutter run". You'll see the
userId:
json
[
'userId'
],
// application has a blue toolbar. Then, without quitting the app, try
id:
json
[
'id'
],
// changing the primarySwatch below to Colors.green and then invoke
title:
json
[
'title'
],
// "hot reload" (press "r" in the console where you ran "flutter run",
// or simply save your changes to "hot reload" in a Flutter IDE).
// Notice that the counter didn't reset back to zero; the application
// is not restarted.
primarySwatch:
Colors
.
blue
,
),
home:
const
MyHomePage
(
title:
'Flutter Demo Home Page'
),
);
);
}
}
}
}
class
MyHomePage
extends
StatefulWidget
{
void
main
()
=
>
runApp
(
const
MyApp
());
const
MyHomePage
({
Key
?
key
,
required
this
.
title
})
:
super
(
key:
key
);
// This widget is the home page of your application. It is stateful, meaning
class
MyApp
extends
StatefulWidget
{
// that it has a State object (defined below) that contains fields that affect
const
MyApp
({
Key
?
key
})
:
super
(
key:
key
);
// how it looks.
// This class is the configuration for the state. It holds the values (in this
// case the title) provided by the parent (in this case the App widget) and
// used by the build method of the State. Fields in a Widget subclass are
// always marked "final".
final
String
title
;
@override
@override
State
<
MyHomePage
>
createState
()
=
>
_My
HomePage
State
();
_MyAppState
createState
()
=
>
_My
App
State
();
}
}
class
_My
HomePage
State
extends
State
<
My
HomePage
>
{
class
_My
App
State
extends
State
<
My
App
>
{
int
_counter
=
0
;
late
Future
<
Album
>
futureAlbum
;
void
_incrementCounter
()
{
@override
setState
(()
{
void
initState
()
{
// This call to setState tells the Flutter framework that something has
super
.
initState
();
// changed in this State, which causes it to rerun the build method below
futureAlbum
=
fetchAlbum
();
// so that the display can reflect the updated values. If we changed
// _counter without calling setState(), then the build method would not be
// called again, and so nothing would appear to happen.
_counter
++
;
});
}
}
@override
@override
Widget
build
(
BuildContext
context
)
{
Widget
build
(
BuildContext
context
)
{
// This method is rerun every time setState is called, for instance as done
return
MaterialApp
(
// by the _incrementCounter method above.
title:
'Fetch Data Example'
,
//
theme:
ThemeData
(
// The Flutter framework has been optimized to make rerunning build methods
primarySwatch:
Colors
.
blue
,
// fast, so that you can just rebuild anything that needs updating rather
),
// than having to individually change instances of widgets.
home:
Scaffold
(
return
Scaffold
(
appBar:
AppBar
(
appBar:
AppBar
(
// Here we take the value from the MyHomePage object that was created by
title:
const
Text
(
'Fetch Data Example'
),
// the App.build method, and use it to set our appbar title.
title:
Text
(
widget
.
title
),
),
),
body:
Center
(
body:
Center
(
// Center is a layout widget. It takes a single child and positions it
child:
FutureBuilder
<
Album
>(
// in the middle of the parent.
future:
futureAlbum
,
child:
Column
(
builder:
(
context
,
snapshot
)
{
// Column is also a layout widget. It takes a list of children and
if
(
snapshot
.
hasData
)
{
// arranges them vertically. By default, it sizes itself to fit its
return
Text
(
snapshot
.
data
!.
title
);
// children horizontally, and tries to be as tall as its parent.
}
else
if
(
snapshot
.
hasError
)
{
//
return
Text
(
'
${snapshot.error}
'
);
// Invoke "debug painting" (press "p" in the console, choose the
}
// "Toggle Debug Paint" action from the Flutter Inspector in Android
// Studio, or the "Toggle Debug Paint" command in Visual Studio Code)
// By default, show a loading spinner.
// to see the wireframe for each widget.
return
const
CircularProgressIndicator
();
//
},
// Column has various properties to control how it sizes itself and
// how it positions its children. Here we use mainAxisAlignment to
// center the children vertically; the main axis here is the vertical
// axis because Columns are vertical (the cross axis would be
// horizontal).
mainAxisAlignment:
MainAxisAlignment
.
center
,
children:
<
Widget
>[
const
Text
(
'You have pushed the button this many times:'
,
),
Text
(
'
$_counter
'
,
style:
Theme
.
of
(
context
)
.
textTheme
.
headline4
,
),
),
],
),
),
),
),
floatingActionButton:
FloatingActionButton
(
onPressed:
_incrementCounter
,
tooltip:
'Increment'
,
child:
const
Icon
(
Icons
.
add
),
),
// This trailing comma makes auto-formatting nicer for build methods.
);
);
}
}
}
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
sign in
to comment