dart
import
'dart:async'
;
import
'dart:convert'
;
import
'package:flutter/material.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'
),
);
if
(response.statusCode ==
200
) {
// If the server did return a 200 OK response,
// then parse the JSON.
return
Album
.
fromJson
(
jsonDecode
(response.body)
as
Map
<
String
,
dynamic
>);
}
else
{
// If the server did not return a 200 OK response,
// then throw an exception.
throw
Exception
(
'Failed to load album'
);
}
}
Future
<
Album
>
updateAlbum
(
String
title)
async
{
final
response =
await
http.
put
(
Uri
.
parse
(
'https://jsonplaceholder.typicode.com/albums/1'
),
headers: <
String
,
String
>{
'Content-Type'
:
'application/json; charset=UTF-8'
,
},
body:
jsonEncode
(<
String
,
String
>{
'title'
: title,
}),
);
if
(response.statusCode ==
200
) {
// If the server did return a 200 OK response,
// then parse the JSON.
return
Album
.
fromJson
(
jsonDecode
(response.body)
as
Map
<
String
,
dynamic
>);
}
else
{
// If the server did not return a 200 OK response,
// then throw an exception.
throw
Exception
(
'Failed to update album.'
);
}
}
class
Album
{
final
int
id;
final
String
title;
const
Album
({
required
this
.id,
required
this
.title});
factory
Album
.
fromJson
(
Map
<
String
,
dynamic
> json) {
return
switch
(json) {
{
'id'
:
int
id,
'title'
:
String
title,
} =>
Album
(
id: id,
title: title,
),
_ =>
throw
const
FormatException
(
'Failed to load album.'
),
};
}
}
void
main
() {
runApp
(
const
MyApp
());
}
class
MyApp
extends
StatefulWidget
{
const
MyApp
({
super
.key});
@override
State
<
MyApp
>
createState
() {
return
_MyAppState
();
}
}
class
_MyAppState
extends
State
<
MyApp
> {
final
TextEditingController
_controller =
TextEditingController
();
late
Future
<
Album
> _futureAlbum;
@override
void
initState
() {
super
.
initState
();
_futureAlbum =
fetchAlbum
();
}
@override
Widget
build
(
BuildContext
context) {
return
MaterialApp
(
title:
'Update Data Example'
,
theme:
ThemeData
(
colorScheme:
ColorScheme
.
fromSeed
(seedColor:
Colors
.deepPurple),
),
home:
Scaffold
(
appBar:
AppBar
(
title:
const
Text
(
'Update Data Example'
),
),
body:
Container
(
alignment:
Alignment
.center,
padding:
const
EdgeInsets
.
all
(
8
),
child:
FutureBuilder
<
Album
>(
future: _futureAlbum,
builder: (context, snapshot) {
if
(snapshot.connectionState ==
ConnectionState
.done) {
if
(snapshot.hasData) {
return
Column
(
mainAxisAlignment:
MainAxisAlignment
.center,
children: <
Widget
>[
Text
(snapshot.data!.title),
TextField
(
controller: _controller,
decoration:
const
InputDecoration
(
hintText:
'Enter Title'
,
),
),
ElevatedButton
(
onPressed: () {
setState
(() {
_futureAlbum =
updateAlbum
(_controller.text);
});
},
child:
const
Text
(
'Update Data'
),
),
],
);
}
else
if
(snapshot.hasError) {
return
Text
(
'
${
snapshot
.
error
}
'
);
}
}
return
const
CircularProgressIndicator
();
},
),
),
),
);
}
}