Flutter SQLite(SQFLite)のサンプルを模写してハマったところについて
Flutter SQLiteを導入後、サンプルコードをそのまま参考にしてしまうと詰む話
Semaphoです。
本稿はFlutter初学者が書いているため、理解不足や意味を履き違えていたり、誤りがある可能性もあります。正確な情報を知りたい人は海外の強強エンジニアの情報を参考にした方がいいので、下記のリファレンスを読むか、ブラウザバックしてください(ノンクレームでお願いするわー)。
参考:
1. Singleton Class in Flutter with NullSafety
2. 【Flutter】sqfliteを使ったローカルDBの利用方法【日本語】
Flutterでモバイル向けのアプリを作るときに、データベースを導入するといったら、SQLiteが選択肢に入る人も多いのではないでしょうか。
私は以前に.NETでアプリを作った際にもSQLiteを導入したので、Flutterでもやってみようと思い、今回利用してみました。
そこで、上記の2つ目の参考記事のコードを参考にしてみることに。
static Database _database;
Future<Database> get database async {
if (_database != null) return _database;
_database = await _initDatabase();
return _database;
}
DBにアクセスする際のシングルトンクラス(_database)を作るときに、以下のように怒られました。
The non-nullable variable '_database' must be initialized. (Documentation) Try adding an initializer expression.
これは初期化する際、中身は空っぽなのでnull許容型としてちゃんと明記してくれよという怒られ方っぽい。null-safetyを利用しているときっと怒られるかと思います。なので、私は以下のようにしました。
static Database? _database;
Future<Database?> get database async {
if (_database != null) return _database;
_database = await _initDatabase();
return _database;
}
Databaseにクエスチョンマーク(?)をつけて、nullableにする。その後はエラーメッセージに従う形で修正していきました。
初学者のハマりどころ
・変数だろうが、クラスだろうが、初期化時点でnullになっているなら、そうであるように明記しておかなくてはならない(?をつける)
・先輩エンジニアの方々がありがたいことにnull-safetyアップデート導入(?)以前からブログやnoteにコードを残してくださっているが、新しい仕様で読み替える必要性もある