はじめに
こちらはFlutter超初心者がサンプル脳死タイピングの末に数時間を無駄にしたという、
とっても怖い実体験から次なる犠牲者(未来の自分)を救済するための覚書です。
大したことは書いていません。
起こったこと
ネット上に落ちてるチュートリアル的な記事を読みながら写経(ほぼ脳死)をしていたとき、
Firestoreからデータを取ってくる処理を実行したところで
StateError (Bad state: field does not exist within the DocumentSnapshotPlatform)
って言われた。
解決策
数時間ググっても何もわからず、ふとコードとFirestoreのコンソールとを見比べてみた。
すると、、、
return ListView(
children: docs.map((doc) {
if (doc == null) {
return const Card(
child: Text('No posts'),
);
}
var email = doc['email'];
var text = doc['text']; <- ここ
return Card(
child: ListTile(
title: Text(text),
subtitle: Text(email),
trailing: email == user?.email
? IconButton(
icon: const Icon(Icons.delete),
onPressed: () async {
db.doc(doc.id).delete();
},
)
: null,
),
);
}).toList());
Firestoreのスクショ
んんっ???message????
ということで、textなんて名前のフィールドは存在せず、それを取ってくるなんてできるはず無いわけで、、、
結論、確認はしっかりしましょうというお話でした。
その後、書き込みと読み込みの処理でフィールドの名前を統一したら何事もなかったかのように普通に動きました。
なぜこんなことが起きたのか?
実はサンプルの写経中に、「こんなことはできるのかな?」とか思いつきで追加機能を考えて、
それをまた脳死で写して、ということをしていました。
結果、単に文字列を保存する名前に「message」と「text」の2つが混在しているのに気づかず、動作させて初めてバグに気が付いたのです。
こんなしょうもないミスで数時間も無駄にした人もいるらしいので皆さんは気をつけるようにしましょう!