Flutter : Cloud Firestore からデータの読み込みと保存まずAndroidで確認
Firebase Hosting に Angular をホスティングして、そこから Firestore にアクセスできたので、同じことをFlutterでも実現する。
1.FlutterにFirebaseを適用
https://firebase.google.com/docs/flutter/etup?hl=ja
この辺りを参考に。
昨年の10月ごろに設定したときには、いろいろトラブルシュートが面倒だった気がするが、Flutterプラグインなど各種ツール類のバージョンが上がってか、かなりすんなり。
2.Flutter アプリ Firebase と統合
2.1 クイックスタート
- https://github.com/firebase/quickstart-android/blob/master/firestore/README.md
- https://firebase.google.com/docs/firestore/quickstart
このあたりを参考に。
2.2 FIrestore設定
Firestoreのセキュリティールールなどの設定は、Firesotreの確認をした時のものを使いまわす
2.3 FirebaseにFlutterアプリの登録
(1) アプリケーションID の設定
https://developer.android.com/studio/build/application-id?hl=ja
(2) google.service.json のダウンロードとFlutterアプリへの登録
Firebaseのコンソール、プロジェクトの概要の歯車アイコンから設定ページを開く
google.service.jsonをダウンロードし
Android Studio のFlutterアプリの、android/app/ にインポートする
メニュー Tools – Flutter – Flutter Package Get を実行
3.Flutter Fire
FluttFlutterから、Firebaseを使うためのプラグインの一覧
https://firebaseopensource.com/projects/firebaseextended/flutterfire/
から、
Cloud Firestore plugin for Flutter を使用する。
https://pub.dev/packages/cloud_firestore
Flutter、Firebase、Angular と Googleにロックオンされた感はあるが、Google謹製フレームワーク同士の連携のため、このあたりの連携ツールが充実しているのは捗る。
ここで、いったん動かしてみると、multidex エラーとやらが発生するので、以下を参照して対応
64K を超えるメソッドを使用するアプリ向けに multidex を有効化する
https://developer.android.com/studio/build/multidex?hl=ja
3.1 Cloud Firestore プラグイン
https://pub.dev/packages/cloud_firestore
こいつを使う。
4.確認実装
Angular同様、テキストフィールドに、LoadボタンでFiresotreの値を読みこみ、Saveで保存するだけ。
4.1 設定
(1) pubspec.yaml
- cloud_firestore をdependenciesに追記
dependencies: flutter: sdk: flutter # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^0.1.2 cloud_firestore: 0.13.4+2
(2) /android/app/build.gradle
- 上で述べたmultidexの対応をdependencies に追記
- Googleサービスを利用する記述を最後尾に追記
dependencies { def multidex_version = "2.0.1" implementation "androidx.multidex:multidex:$multidex_version" : } apply plugin: 'com.google.gms.google-services' // Google Play services Gradle plugin
(3) /lib/main.dart
import 'package:flutter/material.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { final message = "Initial Message."; @override Widget build(BuildContext context) { return new MaterialApp( title: 'Flutter Sample', home: MyPage(message:this.message), ); } } class MyPageState extends State<MyPage>{ // テキストフィールドのステートを管理 final _stateController = TextEditingController(); @override void initState() { super.initState(); } @override void dispose() { this._stateController.dispose(); super.dispose(); } /// LoadボタンがおされたらFirestoreの値を取得 void loadOnPressed() { Firestore.instance.document("sample/sandwichData") .get().then((DocumentSnapshot ds){ setState(() { this._stateController.text = ds["hotDogStatus"]; }); print("status=$this.status"); }); } /// SaveボタンがおされたらFirestoreに値を保存 void saveOnPressed() { Firestore.instance.document("sample/sandwichData") .updateData({"hotDogStatus":_stateController.text}) .then((value) => print("success")) .catchError((value) => print("error $value")); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Flutter State Sample'), ), body: Column( // Columnの配置場所 mainAxisAlignment: MainAxisAlignment.start, // Widgetのサイズ mainAxisSize: MainAxisSize.max, // Columnに組み込んだWidgetの配置場所 crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ Row( mainAxisAlignment: MainAxisAlignment.start, mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ Flexible( child: TextField( controller: _stateController, ), ), Padding( padding: EdgeInsets.all(2.0), child: RaisedButton( onPressed: saveOnPressed, child: Text("Save")), ), Padding( padding: EdgeInsets.all(2.0), child: RaisedButton( onPressed: loadOnPressed, child: Text("Load")) ) ], ), ], ), ); } } class MyPage extends StatefulWidget { final String message; MyPage({this.message}):super() {} @override State<StatefulWidget> createState() => new MyPageState(); }
5.確認
Firestoreの値
Loadボタンで、Firestoreの値をテキストフィールドに読み込みOK
テキストフィールドの値を適当に変更しSaveボタンを押下
Firestoreの値が更新されたOK!