2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

FlutterをFirebaseに連携する仕様が変わっていてハマったのでメモ

Last updated at Posted at 2023-04-04

はじめに

自分で構築した機械学習モデルを自分のスマホで使用するために趣味がてら取っつきやすそうなFlutterをUdemyの一番人気のFlutter & Dart - The Complete Guide [2023 Edition]を通じて勉強しています。
Udemy講義の中でFlutterのVersionを落とすように言っているのですが、せっかくだから最新のFlutter 3.7.3でやりたいと意地を張っていたらハマったので解決方法をQiitaにメモっとこうと思いました。

1. ハマりポイント1

Udemyの講義で使っていたFirestore Classがdeprecatedされていました。
Firestore Classがだめなら、FirebaseFirestore Classに差し替えれば動くでしょと安易に思ったらエラーが出てきました。
具体的な内容は忘れましたが、FlutterFireをInitializeしろと怒られました。

ハマりポイント2

Initializing FlutterFireで、丁寧にFlutterFireのInitializeのやり方があったので、書いてあることをそのまま実行しました。が、以下のところで別のエラー。

# Run the `configure` command, select a Firebase project and platforms
flutterfire configure

FirebaseCommandException: An error occured on the Firebase CLI when attempting to run a command.
文字通り、Firebase CLIを入れればいいのかと思い、公式に従いインストール。
ここでも、自パソコンにNode.jsを入れてなかったのでstandalone binaryをそのままWindowsに落としたらPATHがなぜか通らなかったので結局Node.jsを落としてからnpmでインストールする二度手間もありました。

ハマりポイント2 追記

後日新しくプロジェクトを作りflutterfire configureを実行したところ、以下のエラーが出ました。

FirebaseCommandException: An error occured on the Firebase CLI when attempting to run 
COMMAND: firebase projects:list --json

察するに、何らかの原因でFirebaseのプロジェクトにアクセスできなかったようです。
以下のコマンドを実行し、CLIでFirebaseに入りなおしたところ解消できました。

firebase login --reauth

ハマりポイント3

Initializing FlutterFireに戻り、main.dartを直したところで、FirebaseFirestore Classからデータ取れるでしょと思ったら、だめでした。
Udemyを元にしたコードで、Firestoreのデータを取ろうとしている箇所は以下です。

//UdemyのCode
FirebaseFirestore.instance
    .collection('chats/d6J4hnZnvm8dS5fndoHG/messages')
    .snapshots()
    .listen((data) {
  print(data.documents[0]['text']);
});

dataQuerySnapshot Classdocumentsがありませんでした。docsが代わりにあったので、特に調べもせずdocsに変えて実行。

//UdemyのCode
FirebaseFirestore.instance
    .collection('chats/d6J4hnZnvm8dS5fndoHG/messages')
    .snapshots()
    .listen((data) {
  print(data.docs[0]['text']);
});

これで値が取れました。

ハマりポイント4

Udemyのdocumentsdocsに変更する前に、もう1ハマりありました。なぜか、公式サイトに従ったデータの取り方をすべきでしょというDeveloper気質を急に発揮し、コードを大きく変えたところハマりました。
ハマった時のコードは修正して持ち合わせていないのですが、自分がやってしまったのは

final docRef = FirebaseFirestore.instance
    .collection('chats/d6J4hnZnvm8dS5fndoHG/messages')
.doc();

と、doc()にPATHを指定せずに書いていたことです。
DocumentReference ClassについてIf no [path] is provided, an auto-generated ID is used.とあったので勘違いしていました。

final docRef = FirebaseFirestore.instance
    .collection('chats/d6J4hnZnvm8dS5fndoHG/messages')
    .limit(1);

docRef.get().then(
  (querySnapshot) {
    final doc = querySnapshot.docs.first;
    final data = doc.data() as Map<String, dynamic>;
    print(data['text']);
    // ...
  },
  onError: (e) => print("Error getting document: $e"),
);
}),

のようにlimit(1)で最初のDocumentを無事取得できました。
ちなみにlimit(1)のやり方はChatGPTに教わりました。

最後に

公式以外の情報は古いことがほとんどなので、あまり参考にしませんでした。Migration Guideによると、どうやら2020年にFlutterとFirebaseの連携作法が変わったようです。
FlutterのFirebase周りに関するバグ解決は公式サイトとChatGPTだけを頼りにした方が、効率はよさそうな印象を受けました。ChatGPTはたまに嘘つきますけどね。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?