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
>
deleteAlbum
(
String
id)
async
{
final
http.
Response
response =
await
http.
delete
(
Uri
.
parse
(
'https://jsonplaceholder.typicode.com/albums/
$
id
'
),
headers: <
String
,
String
>{
'Content-Type'
:
'application/json; charset=UTF-8'
,
},
);
if
(response.statusCode ==
200
) {
// If the server did return a 200 OK response,
// then return an empty Album. After deleting,
// you'll get an empty JSON `{}` response.
// Don't return `null`, otherwise `snapshot.hasData`
// will always return false on `FutureBuilder`.
return
Album
.
empty
();
}
else
{
// If the server did not return a "200 OK response",
// then throw an exception.
throw
Exception
(
'Failed to delete album.'
);
}
}
class
Album
{
int
? id;
String
? title;
Album
({
this
.id,
this
.title});
Album
.
empty
();
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
> {
late
Future
<
Album
> _futureAlbum;
@override
void
initState
() {
super
.
initState
();
_futureAlbum =
fetchAlbum
();
}
@override
Widget
build
(
BuildContext
context) {
return
MaterialApp
(
title:
'Delete Data Example'
,
theme:
ThemeData
(
colorScheme:
ColorScheme
.
fromSeed
(seedColor:
Colors
.deepPurple),
),
home:
Scaffold
(
appBar:
AppBar
(
title:
const
Text
(
'Delete Data Example'
),
),
body:
Center
(
child:
FutureBuilder
<
Album
>(
future: _futureAlbum,
builder: (context, snapshot) {
// If the connection is done,
// check for response data or an error.
if
(snapshot.connectionState ==
ConnectionState
.done) {
if
(snapshot.hasData) {
return
Column
(
mainAxisAlignment:
MainAxisAlignment
.center,
children: <
Widget
>[
Text
(snapshot.data?.title ??
'Deleted'
),
ElevatedButton
(
child:
const
Text
(
'Delete Data'
),
onPressed: () {
setState
(() {
_futureAlbum =
deleteAlbum
(snapshot.data!.id.
toString
());
});
},
),
],
);
}
else
if
(snapshot.hasError) {
return
Text
(
'
${
snapshot
.
error
}
'
);
}
}
// By default, show a loading spinner.
return
const
CircularProgressIndicator
();
},
),
),
),
);
}
}