Flutter

【Flutter】shared_preferencesでメモアプリを作る【解説付き】

こんにちは、テルプロです!

「shared_preferencesの使い方がわからない」とお悩みではないでしょうか?

テルプロ

本記事ではそんな悩みを解決していきます!

本記事を読むことで
  1. 「shared_preferences」の使い方をサンプルで理解できる
  2. コードを公開しているので、自分の環境で確かめることができる

shared_preferencesでメモアプリを作る

事前準備

パッケージをインストール

今回使用するパッケージは以下の通りです。

dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.0.13

dev_dependencies:
  flutter_lints: ^1.0.0
  flutter_test:
    sdk: flutter

プロジェクト構成

リポジトリ構成

完成イメージ

本アプリは1画面のみの構成になります。タイトルとコメントを入力して「Save」ボタンを押すと、入力されたデータがローカルに保存されます。

アプリ起動時にデータの読み込みを行うことで、保存された「タイトル」「コメント」「アイコン」が表示されます。

「Clear」ボタンを押すと、保存されたデータは完全に削除されます。

ソースコード

main.dart

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:simple_memo/view/home_page.dart';

Future main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await SystemChrome.setPreferredOrientations([
    DeviceOrientation.portraitUp,
    DeviceOrientation.portraitDown,
  ]);
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  static const String title = 'simple_memo';

  @override
  Widget build(BuildContext context) => MaterialApp(
        debugShowCheckedModeBanner: false,
        title: title,
        theme: ThemeData.dark(),
        home: const HomePage(),
      );
}

view / home_page.dart

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

// keyを用意
const titleKey = 'name';
const commentKey = 'comment';
const iconKey = 'icon';

class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);
  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  final titleController = TextEditingController();
  final commentController = TextEditingController();
  String title = '';
  String comment = '';
  bool icon = false;

  @override
  void initState() {
    super.initState();
    init();
  }

  // アプリ起動時に保存したデータを読み込む
  void init() async {
    final prefs = await SharedPreferences.getInstance();
    setState(() {
      title = prefs.getString(titleKey)!;
      comment = prefs.getString(commentKey)!;
      icon = prefs.getBool(iconKey)!;
    });
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () => FocusScope.of(context).unfocus(),
      child: Scaffold(
        body: Padding(
          padding: const EdgeInsets.all(30.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: [
              const Text(
                'Simple Memo',
                style: TextStyle(fontSize: 38.0, fontWeight: FontWeight.w100),
              ),
              ListTile(
                // 保存された場合のデータを表示する
                leading: icon == false
                    ? const Icon(Icons.chat_bubble_outline)
                    : const Icon(Icons.chat),
                tileColor: Colors.white24,
                title: Text(title),
                subtitle: Text(comment),
              ),
              TextField(
                controller: titleController,
                decoration: const InputDecoration(hintText: 'タイトルを入力してね'),
              ),
              TextField(
                controller: commentController,
                decoration: const InputDecoration(hintText: 'コメントを入力してね'),
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: [
                  ElevatedButton(
                    onPressed: () async {
                      final prefs = await SharedPreferences.getInstance();
                      // データを保存する
                      prefs.setString(titleKey, titleController.text);
                      prefs.setString(commentKey, commentController.text);
                      prefs.setBool(iconKey, true);
                      setState(() {
                        // データを読み込む
                        title = prefs.getString(titleKey)!;
                        comment = prefs.getString(commentKey)!;
                        prefs.setBool(iconKey, true);
                        if (title != '' && comment != '') {
                          icon = true;
                        }
                      });
                    },
                    child: const Text('Save'),
                  ),
                  ElevatedButton(
                    onPressed: () async {
                      final prefs = await SharedPreferences.getInstance();
                      setState(() {
                        // データを削除する
                        icon = false;
                        title = '';
                        titleController.text = '';
                        comment = '';
                        commentController.text = '';
                        prefs.remove(titleKey);
                        prefs.remove(commentKey);
                      });
                    },
                    child: const Text('Clear'),
                  ),
                ],
              ),
            ],
          ),
        ),
      ),
    );
  }
}

大変お疲れ様でした!以上でアプリは完成です!

今回ご紹介したアプリ全体のソースコードはこちらです。

よろしければ、ご参考にどうぞ。

GitHub:https://github.com/terupro/simple_memo

まとめ

今回は「shared_preferences」を用いたメモアプリの作り方をご紹介しました。

shared_preferencesを使えば、ローカルに簡単なデータを保存することができます。便利なパッケージなので、ぜひ使ってみてください。

▼以下では、私の実体験に基づいて「Flutterの効率的な勉強法」の具体的な手順を詳しく解説しています。よろしければ、ご参考にどうぞ!

最後までご覧いただきありがとうございました。ではまた!

参考文献
ABOUT ME
テルプロ
東京都在住のアプリエンジニア。大学では、ソフトウェア開発の研究に取り組む。長期のエンジニアインターンシップを経て、実務スキルを磨き、現在はフリーランスエンジニアとしても活動中。メインはモバイルアプリ開発。IT関連の記事監修も行い、技術の共有と普及に励んでいます。 監修実績(レバテックフリーランス
\ 登録しておいて損なし!IT就活支援サービス /
1位:レバテックルーキー
レバテックルーキー」とは、新卒でITエンジニアを目指す学生の支援に特化した就職エージェントです。業界支持率NO.1の実績を誇っており、エージェント選びに悩む学生におすすめです。エンジニア業界を熟知したアドバイザーが担当します。面接対策だけでなく、学生の志向性やスキル、入社後のキャリアパスを考慮したアドバイスをしてくれる就職活動の強い味方となります。
おすすめ度
URLレバテックルーキーはこちら

 

2位:OfferBox
OfferBox」とは、企業が興味を持った学生にオファーする、新しい就活サイトです。学生は自分のプロフィールを登録しておくだけで、企業からオファーをもらえます。学生利用率No.1で就活生の3人に1人が利用しており、IT業界を志望する学生にもおすすめです。いわゆる一斉配信ができないため、企業はしっかりと学生のプロフィールを見て、オファーを送ってくるので安心です。
おすすめ度
URLオファー型就活アプリOfferBox

 

3位:GeekSalon
GeekSalon」とは、全国展開の大学生限定プログラミングスクールです。Web開発やアプリ開発など多様なコースを提供しています。お値段は他スクールの3分の1程度の料金で、大学生でも通いやすい値段設定です。専属メンターが全面的にサポートしてくれるため、未経験でも安心です。また、切磋琢磨できる同世代の仲間に出会えます。スクールを検討している大学生におすすめです。
おすすめ度
URL大学生限定コミュニティ「GeekSalon」