[読書会]インターネット上のデータを削除する

(当頁はdocs.flutter.dev(https://docs.flutter.dev/cookbook/networking/delete-data)のリファレンスブログです。)

 ここでは、http パッケージを使用してインターネット経由でデータを削除する方法について触れています。

1.http パッケージの追加

(前述「[読書会]インターネット経由でデータを更新する」と同様)

2.サーバ上のデータの削除

 ここでは、http.delete() メソッドを使用して、サーバ上のアルバムデータを削除する方法について触れています。
(この例では、JSONPlaceholder API を使用してアルバムを削除します。)

2.サーバ上のデータの削除(例)
//データの削除
Future<Album> deleteAlbum(String id) async {
  final http.Response response = await http.delete(
    //削除対象のアルバムの URL
    Uri.parse('https://jsonplaceholder.typicode.com/albums/$id'),
    headers: <String, String>{
      //JSON データの送信形式を指定
      'Content-Type': 'application/json; charset=UTF-8',
    },
  );

  if (response.statusCode == 200) {
    return Album.empty();
  } else {
    throw Exception('Failed to delete album.');
  }
}

3.画面の更新

 ここでは、データが削除されたかどうかを確認するために、以下の手順を説明しています。

  1. サーバからデータを取得して画面に表示する。
  2. 「Delete Data」ボタンを押したときにデータを削除する。
  3. 削除後の状態(例: “Deleted”)を画面に反映する。
3.画面の更新
Column(
  mainAxisAlignment: MainAxisAlignment.center,
  children: <Widget>[
    //snapshot.data が 存在する場合、snapshot.data.title の値を表示
    //snapshot.data が null の場合、'Deleted' を表示
    Text(snapshot.data?.title ?? 'Deleted'),
    ElevatedButton(
      child: const Text('Delete Data'),
      onPressed: () {
        setState(() {
          _futureAlbum = deleteAlbum(
            snapshot.data!.id.toString()
          );
        });
      },
    ),
  ],
);

4.サンプルコード

インターネット上のデータを削除する:
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) {
    return Album.fromJson(
      jsonDecode(response.body) as Map<String, dynamic>
    );
  } else {
    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) {
    return Album.empty();
  } else {
    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 (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}');
                }
              }

              return const CircularProgressIndicator();
            },
          ),
        ),
      ),
    );
  }
}

コメントを残す