Closed8

Flutter+Firebaseエミュレーター(LocalのFirestoreに書き込むまで)

sakutarosakutaro

Firestoreをローカルでいじいじできるところまで行きたい。

まずは、firebase初期化

$ firebase init

作っておいたプロジェクト選択。

あとは、なすがまま・・・

=== Firestore Setup

Firestore Security Rules allow you to define how and when to allow
requests. You can keep these rules in your project directory
and publish them with firebase deploy.

? What file should be used for Firestore Rules? firestore.rules

Firestore indexes allow you to perform complex queries while
maintaining performance that scales with the size of the result
set. You can keep index definitions in your project directory
and publish them with firebase deploy.

? What file should be used for Firestore indexes? firestore.indexes.json

i  Writing configuration info to firebase.json...
i  Writing project information to .firebaserc...
i  Writing gitignore file to .gitignore...

✔  Firebase initialization complete!

初期化Done

sakutarosakutaro

エミュレーター起動

$ firebase emulators:start

http://localhost:4000/firestoreへアクセス

sakutarosakutaro

Fluttterからエミュレータへ接続できるようにする。

元々あったmain.dartをrun.dartにリネーム

run.dart
void run({bool isEmulator = false}) async {
  final logger = SimpleLogger();
  logger.fine('start(isEmulator: $isEmulator)');

  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(ProviderScope(
    child: MyApp(),
  ));
}
main_emu.dart
import 'run.dart';

void main() => run(isEmulator: true);
main.dart
import 'run.dart';

void main() => run();
$ flutter run --target lib/main_emu.dart

これで、ログに

start(isEmulator: true)

と出るはずだが。。出ない。

sakutarosakutaro
logger.info('start(isEmulator: $isEmulator)');

で表示された。

sakutarosakutaro

Authのエミュレーターが動いてないのかな。

$ firebase init emulators

そういえば初期化の時に、Authのエミュレーターは選択してなかったかも。
選択する

エミュレーター起動中に初期化したらうまくいかなかったので、エミュレーター終了してから
再度初期化。

Authも起動した。

sakutarosakutaro

エミュレーターのFirestoreに書き込もうとするもエラー

[VERBOSE-2:ui_dart_state.cc(177)] Unhandled Exception: [cloud_firestore/permission-denied] The caller does not have permission to execute the specified operation.

セキュリティルールで、全拒否してる状態だった。そりゃそうだ。

一旦全許可にして

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}

再度、書き込み実行で無事Firestoreにデータ生成されることを確認。

このスクラップは2021/01/24にクローズされました