【Flutter】簡単なToDoアプリの作成手順

皆さんこんにちは！現役大学生のKamichan_R(@Kamichan_R)です。
今回は、世界中で多く利用されているクロスプラットフォーム開発のフレームワークであるFlutterでアプリ開発をしました。Flutterでアプリ開発をするためにDart,SQLiteを勉強しました。そして、学習のアウトプットとしてToDoアプリを制作しました。
この記事では、今回制作したToDoアプリの説明・開発手順と学習の振り返りを紹介します。

#アプリ制作の説明と経緯
ここでは、ToDoアプリの概要と使用した技術と学習の目的を説明します。
##アプリの概要
今回開発したアプリは基本的なToDoアプリの機能が実装されています。タスクの追加・読取・編集・削除(CRUD)の機能があります。タスク作成時は、タスク名・優先度・期限・メモを入力します。複数のタスクがある場合は期日が早い順に並べるという機能があります。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【Todoアプリ完成】<br><br>1ヶ月前位から <a href="https://twitter.com/hashtag/Flutter?src=hash&amp;ref_src=twsrc%5Etfw">#Flutter</a> を勉強して、<a href="https://twitter.com/hashtag/%E3%82%A2%E3%83%97%E3%83%AA%E5%88%B6%E4%BD%9C?src=hash&amp;ref_src=twsrc%5Etfw">#アプリ制作</a> をしていました。そしてついに完成です！<br>クロスプラットフォーム開発やデータベースの勉強が出来ました。<br>制作中に少しずつ理解が深まっていくことが楽しかったです！<a href="https://twitter.com/hashtag/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0?src=hash&amp;ref_src=twsrc%5Etfw">#プログラミング</a> <a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a> <a href="https://t.co/tGJJnZ2l2E">pic.twitter.com/tGJJnZ2l2E</a></p>&mdash; Kamichan_R@プログラミング学習中 (@Kamichan_R) <a href="https://twitter.com/Kamichan_R/status/1442262709332955140?ref_src=twsrc%5Etfw">September 26, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<img width="400" alt="todoapp1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1663632/e05a0de1-7876-d39a-bdfe-9cb6d0499a1d.png"><img width="400" alt="todoapp2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1663632/29367107-f087-eecc-3a7b-f91926ec093b.png"><img width="400" alt="todoapp1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1663632/6fa2a273-ca0d-dcbd-9380-fcce6a365dcf.png">

##技術選定
* [Flutter](https://flutter.dev/)
 * iOSとAndroidアプリを同時に作成できるクロスプラットフォーム開発のフレームワーク
* [Dart](https://dart.dev/)
 * Flutterでコードを書く際に使用するプログラミング言語
 * オブジェクト指向型の言語であり、JavaScriptに似た言語
* [SQLite](https://www.sqlite.org/index.html)
 * MySQLと比較して高速で動き、記述が楽である

##学習の目的
以前、大学で所属しているサークルのホームページや[よじメーカー](http://yozimaker.xyz)というWebページ・サービスを作成しました。これらの制作では主に以下のことを経験することが出来ました。

* Progateやドットインストールなどで学習した言語でのサービス開発
* 要件定義・外部設計・内部設計などの開発手順の実践

今回のアプリ開発では、

* 今までやったことがないアプリ開発に挑戦
* クロスプラットフォーム開発の体験と実践
* データベース操作の実践

を主な目的としました。FlutterでのToDoアプリ開発はこの学習目的の達成にピッタリだったので、1ヶ月で勉強してアプリを完成させました。

#開発手順
ToDOアプリの制作のために要件定義・外部設計・内部設計を行いました。
##要件定義
今回のToDoアプリでは開発のスピードを重視して、複雑な機能は取り入れず、基本的なCRUD機能の実装を目的にしました。なぜなら、データベースの実践においてCRUD機能は基本であり、ToDoアプリには必要不可欠だからです。

##外部設計
次にアプリの操作で必要な画面は何かを考えます。要件定義でCRUD機能の実装を決定したので、タスク作成や編集の画面(Create, Updateの部分)、必要な画面は全タスクの表示の画面と各タスクの詳細や編集・削除ボタンが表示されるする画面(Read, Deleteの部分)が必要であると考えました。この方針でToDoアプリを制作していきます。
![IMG_0371.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1663632/8a05140c-a20b-e229-891d-5a519e121be6.png)

##内部設計
内部設計では主にデータベースの設計に注意しました。今回のToDoアプリでは、タスク名・優先度・期限・メモの機能を実装するので、データベースは下の画像のようにしました。idはINTEGER PRIMARY KEY AUTOINCREMENTによって主キーの機能を果たします。そして、タスク名・優先度・期限はNULLを許可しない構造になっています。

##実装
実際のコードはGitHubに載せています。参考にしたい方は以下のリンクへ。

https://github.com/KamichanR/flutter_todoapp

#振り返り
##Flutterは便利
Flutterは1つのコードでiOS, Androidに適したウィジェットと表示してくれるので、同じようなコードを複数回書く必要もなくなる。そして、UIも使いやすく、様々なものが用意されているので使い勝手の良いものを使えば便利なアプリが簡単に制作できることも実感できました。

##データベースの実装
データベースを用いたサービス制作は今回が初めてでしたが、無事にアプリが正常に動作することが確認できたので一安心です。今回はSQLiteだったので、主キーの用意やデータ型に気をつければ無事に動作しました。
しかし、SQLiteはデータ型としてDateTime型を使うことができないので、String型に直してからデータベースに挿入して、データを持ってくるときはString型からDateTime型に直すという手順が必要だったので、少し苦戦しました。
今回は単一のテーブルで、挿入するデータ構造も単純だったから時間がかからずに実装できました。しかし、複数のテーブルと連携させるとなるとさらに複雑なコードや構造になると思うので、機会があれば実践してみたいと思いました。

##改善点
今回はCRUD機能の実装が最優先事項でした。しかし、さらに見やすく操作しやすいUIの実装をしてみてもいいのかなと思いました。そして、ToDoアプリにはほとんどあるタスクの完了・未完了を操作するチェックボタンのようなものは一回実装してみてもいいかなと思ったけれど、実装の方法がいまいち頭に浮かばなかったので実は諦めました。もう少し、関数の呼び出しについての理解を深めていく必要があると思いました。

#最後に
私は、プログラミングやITについての勉強をしていて、今回のようにプログラミングでアプリ・サービスを作成や、データサイエンスについて学習をしています。[Twitter](https://twitter.com/Kamichan_R)もやっていますので、よろしければフォローよろしくおねがいします。私が今まで作成したサービス・アプリのポートフォリオもありますので、ぜひお立ち寄りください。

https://kamichanr.github.io/portfolio/