自分の備忘録用記事です。
※2021/03/03 こちらのページに従い、firebase_coreを使うパターンも記載しました。
下記の記事を参考にしてます。
Flutter projectの作成
まずはFlutter projectの作成。
今回はAndroid Studioメインで作成します。
(Flutterのプラグインは導入済みの想定。まだの人はこちらから)
Start a new Flutter projectをクリック。
![スクリーンショット 2020-04-15 17.35.45.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F74daa733-1516-f43a-48ed-b31f80c398b1.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=74cb1c1a25bf52288a698b5aa5fff901)
Flutter Applicationを選択し、Nextをクリック。
![スクリーンショット 2020-04-16 12.20.28.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F9329d599-a08a-5834-b304-1bce554a9d26.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=c61c07192e012ac1e641e714eaa7e17b)
Packeage Nameを入力し、Finishをクリック。。
※Packeage Nameは任意で良いです。
![スクリーンショット 2020-04-15 17.38.28.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2Fb2d0442e-06d7-19c4-68e1-4548d5bf87b8.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=58df6220bc1bc63f4c333411cbd51870)
プロジェクトが立ち上がったら、pubspec.yamlのdependenciesに下記の文言を追加。
(Android StudioならShiftキーを2回押すとファイル検索できるので、pubspec.yamlと入力してください)
dependencies:
flutter:
sdk: flutter
// この行を追加
cloud_firestore: ^0.13.0+1
// firebase_coreを使う場合、こちらの行に変更する
// firebase_core: "^1.0.0"
// cloud_firestore: "^1.0.0"
pubspec.yamlを編集したら、flutter packages getを実施するか、
Android Studioであれば画面右上のPub getをクリック。
![スクリーンショット 2020-04-16 13.02.52.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F2504089b-fdcd-6666-e290-6b32bca87d56.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=bf3e3fa7d40c56b437fb0d93b9a4ad68)
packagesをインストールし終えたら、Android emulatorでアプリを実行し
デフォルトのFlutter Appが立ち上がることを確認します。
![スクリーンショット 2020-04-16 13.23.54.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F7b808dce-d2fb-218a-f83e-6aa7efd8f170.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=b9aadc6eb2fe299b03d27d7e4e8b2ead)
※Cannot fit requested classes in a single dex fileエラーが出た場合、minSdkVersionのバージョンを16->21に変更し、再度アプリを実行してください。
// minSdkVersion 16
minSdkVersion 21
サンプルコードの実装
main.dartの既存コードを削除し、下記のコードを貼り付けます。
実行するとdummySnapshotの値がListViewで表示されるはずです。
コードの詳細は元ページを参照してください。
firebase_core利用なし
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
final dummySnapshot = [
{"name": "Filip", "votes": 15},
{"name": "Abraham", "votes": 14},
{"name": "Richard", "votes": 11},
{"name": "Ike", "votes": 10},
{"name": "Justin", "votes": 1},
];
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Baby Names',
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() {
return _MyHomePageState();
}
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Baby Name Votes')),
body: _buildBody(context),
);
}
Widget _buildBody(BuildContext context) {
return _buildList(context, dummySnapshot);
}
Widget _buildList(BuildContext context, List<Map> snapshot) {
return ListView(
padding: const EdgeInsets.only(top: 20.0),
children: snapshot.map((data) => _buildListItem(context, data)).toList(),
);
}
Widget _buildListItem(BuildContext context, Map data) {
final record = Record.fromMap(data);
return Padding(
key: ValueKey(record.name),
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
child: Container(
decoration: BoxDecoration(
border: Border.all(color: Colors.grey),
borderRadius: BorderRadius.circular(5.0),
),
child: ListTile(
title: Text(record.name),
trailing: Text(record.votes.toString()),
onTap: () => print(record),
),
),
);
}
}
class Record {
final String name;
final int votes;
final DocumentReference reference;
Record.fromMap(Map<String, dynamic> map, {this.reference})
: assert(map['name'] != null),
assert(map['votes'] != null),
name = map['name'],
votes = map['votes'];
Record.fromSnapshot(DocumentSnapshot snapshot)
: this.fromMap(snapshot.data, reference: snapshot.reference);
@override
String toString() => "Record<$name:$votes>";
}
firebase_core利用あり
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
final dummySnapshot = [
{"name": "Filip", "votes": 15},
{"name": "Abraham", "votes": 14},
{"name": "Richard", "votes": 11},
{"name": "Ike", "votes": 10},
{"name": "Justin", "votes": 1},
];
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Baby Names',
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() {
return _MyHomePageState();
}
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Baby Name Votes')),
body: _buildBody(context),
);
}
Widget _buildBody(BuildContext context) {
return _buildList(context, dummySnapshot);
}
Widget _buildList(BuildContext context, List<Map> snapshot) {
return ListView(
padding: const EdgeInsets.only(top: 20.0),
children: snapshot.map((data) => _buildListItem(context, data)).toList(),
);
}
Widget _buildListItem(BuildContext context, Map data) {
final record = Record.fromMap(data);
return Padding(
key: ValueKey(record.name),
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
child: Container(
decoration: BoxDecoration(
border: Border.all(color: Colors.grey),
borderRadius: BorderRadius.circular(5.0),
),
child: ListTile(
title: Text(record.name),
trailing: Text(record.votes.toString()),
onTap: () => print(record),
),
),
);
}
}
class Record {
final String name;
final int votes;
final DocumentReference reference;
Record.fromMap(Map<String, dynamic> map, {this.reference})
: assert(map['name'] != null),
assert(map['votes'] != null),
name = map['name'],
votes = map['votes'];
Record.fromSnapshot(DocumentSnapshot snapshot)
: this.fromMap(snapshot.data(), reference: snapshot.reference);
@override
String toString() => "Record<$name:$votes>";
}
![スクリーンショット 2020-04-16 14.13.07.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F06cbb2bb-6912-828f-4365-b53ee64766e8.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=5dedce43255c15d64f064fa5045d0127)
Firebaseにプロジェクト作成
プロジェクトを作成をクリック。
(アカウント作成は省略しますので必要に応じて行ってください。)
![スクリーンショット 2020-04-15 19.07.09.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2Ffc3d0a69-2bfe-50e4-2bfe-c0962bd1d239.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d709f48ed37a0c7b19b7a7182356893d)
プロジェクト名を入力。
※任意でOK。
![スクリーンショット 2020-04-15 19.07.53.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F1c639fbf-3f6b-dab2-9c01-db6ff0a7d8ab.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=2a3edb641ba46095096d24158acb7773)
下記の通り作成できればOKです。
![スクリーンショット 2020-04-15 19.09.45.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F9feb3899-7ee9-ebf3-8b16-3c6f9b7b5af4.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=48254bb1c74950e6834f9da20b90b6ed)
Androidアプリの設定
まずはAndroidの設定を追加します。
プロジェクトページ真ん中あたりのドロイド君をクリック。
![スクリーンショット 2020-04-15 19.10.15.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2Faec02499-71ad-c9e6-3485-7714c3e98bc1.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=20a42213477eca5d690334b2d2bdf6f1)
パッケージ名を入力。
※パッケージ名はFlutter projectを作成した時のものです。
ex)com.example.babynames
忘れた場合、android/app/src/main/AndroidManifest.xmlの一番上の方に記載されています。
![スクリーンショット 2020-04-15 19.18.44.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F6bbcc394-7ebf-0be4-57c8-f472f65bb042.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d4efa5e18e1f8bce9e55e95f89298700)
※ Google sign-inを使いたい場合、
デバッグ用の署名証明書 SHA-1も入力しておく必要があるみたいです。
ターミナルで下記のコマンドを実行すると
SHA1: DA:39:A3:EE:5E:6B:4B:0D:32:55:BF:EF:95:60:18:90:AF:D8:07:09 のように取得できるので、必要に応じて入力してください。
入力するとパスワードを聞かれますが、初期パスワードはandroidです。
keytool -list -v \
-alias androiddebugkey -keystore ~/.android/debug.keystore
アプリを登録したら、次はgoogle-services.jsonをダウンロードします。
![スクリーンショット 2020-04-15 19.19.04.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F6775567f-4525-9e13-bc64-f8c77bd9cc46.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=a1a8fa0e244c55b5348dc45156fcca91)
ダウンロードしたgoogle-services.jsonをプロジェクトのandroid/app配下に配置。
(Android Studioを開き、android/appの部分にドラッグ&ドロップでOK)
google-services.jsonを配置したら、
android/app/build.gradleとandroid/build.gradleをそれぞれ編集。
dependencies {
// dependencies内に下記の一行を追加
implementation 'com.google.firebase:firebase-analytics:17.2.2'
}
...
// ファイルの一番下に下記の一行を追加
apply plugin: 'com.google.gms.google-services'
buildscript {
...
dependencies {
...
// 下記の文言を追加
classpath 'com.google.gms:google-services:4.3.3'
}
}
Androidエミュレータを起動し、下記の画面が表示されることを確認する。
![スクリーンショット 2020-04-16 11.07.20.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F3be5c731-fb16-d032-9341-9ad6e6078ca3.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=77d90a5ea1a0bf94863eb990d7b40308)
Firebaseも下記のような表示になるはずです。
![スクリーンショット 2020-04-16 10.43.30.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F9d7620ad-287c-0674-7bba-4b8374e5ccf7.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=f97144549430e1f571fddd084bfe1f05)
iOSアプリの設定
次にiOSの設定を追加します。
プロジェクトページ真ん中あたりのiOSをクリック。
![スクリーンショット 2020-04-15 19.10.15.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2Faec02499-71ad-c9e6-3485-7714c3e98bc1.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=20a42213477eca5d690334b2d2bdf6f1)
bundle idを入力。
※bundle idはAndroidのパッケージ名と同じです。
ex)com.example.babynames
![スクリーンショット 2020-04-15 19.26.03.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F8f8dbf6d-e644-ce3a-0c70-21e06753be28.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=80c1d502b1b0b48d8e92b97b0e96448b)
アプリを登録したら、次はGoogleService-Info.plistをダウンロードします。
![スクリーンショット 2020-04-15 19.26.14.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F68e97f83-319e-d02a-cf64-6800832462e5.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=f868749c35b6d33480e9a50ea9e30413)
ダウンロードしたら、ターミナルで下記のコマンドを入力し、Xcodeでプロジェクトを開きます。
open {プロジェクトファイルパス}/ios/Runner.xcworkspace
開いたら、まずはbundle idが正しく入力されているか確認します。
(bundle identifierが正しいことを確認してください)
![スクリーンショット 2020-04-16 10.00.32.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F80af4bd6-f035-ad31-0952-92f474f93261.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=52a5dbf1a18aad724cc64fecdf8fe475)
次にダウンロードしたGoogleService-Info.plistをRunner/Runner配下に配置。
(Runner/Runner直下にドラッグ&ドロップでOK)
![スクリーンショット 2020-04-16 10.05.51.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2Fb4d272c2-446c-80a0-e375-2cc20e758281.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=dc7bb94d2bc1386e29be7f4841d085af)
配置後は下記のようになります。
![スクリーンショット 2020-04-16 10.06.19.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F05205723-4e13-a7ae-40e2-6eb01b7f1281.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d7c81c600bac985065b4f9efcee3900f)
iOSエミュレータを起動し、Androidと同じ画面が表示されていることを確認する。
![スクリーンショット 2020-04-16 16.03.47.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F4539177e-eb73-c831-39ba-54950e0a2268.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=f01094925cd86bd6cc7bd0f09b853425)
![スクリーンショット 2020-04-16 10.48.27.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F953eb504-6ac8-a796-f3fb-3ea6d3e7b20c.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=80cfc40b70bc84b6483bf7e6489c1e9a)
Databaseの作成
投票数をアプリで共有するためにDatabaseを作成します。
左ペインからDatabaseを選択。
![スクリーンショット 2020-04-16 10.53.22.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2Fe8e0d71e-574a-a882-4bb2-528bb70c5a6e.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=e3ee92073d62cb2a6f58b580b291f0b8)
データベースの作成をクリック。
![スクリーンショット 2020-04-16 10.53.42.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F06d74d84-92f3-7486-bd7f-3af1f55f055c.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=b6df3bfb64140a166782f1ca7c6bdc25)
テストモードで開始を選択し、次へをクリック。
![スクリーンショット 2020-04-16 10.54.11.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2Fb0090c95-aa0f-258c-1a70-c685deec01c9.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=29f13e94b3f4abf1b94d9ebdb15392ee)
Cloud Firestoreのロケーションを選択。
※任意でOK
![スクリーンショット 2020-04-16 10.54.31.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F607f7fda-c0c8-e8cb-583f-e04d9ff04cb8.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=fec50a1a8c13cd6bb63c5ae05ee18c86)
コレクションを開始をクリックし、コレクションIDを入力。
※任意でOK(コレクションIDは後で使うので覚えておいてください)
![スクリーンショット 2020-04-16 10.56.28.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F40c148f7-9aad-ea9a-dfb5-76f92637f50e.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=2603aab062d4510459c2aa74c65a4938)
リスト作成用のデータを登録していく。
詳細はキャプチャ参照
![スクリーンショット 2020-04-16 16.39.20.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F71295fb1-e115-6bea-b114-ad3a90a770ca.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=ab1b520e41e95f77088092696565b002)
適当な数を追加し、下記のような形にします。
![スクリーンショット 2020-04-16 11.02.01.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F116581%2F7d87b5e8-f4a2-f949-6472-e1bf074e79ac.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=aec3ef8f25703f83401bba5c751d29cc)
投票アプリの実装
Android Studioを開き、main.dartの下記の部分を編集します。
firebase_core利用なし
// 削除
// final dummySnapshot = [
// {"name": "Filip", "votes": 15},
// {"name": "Abraham", "votes": 14},
// {"name": "Richard", "votes": 11},
// {"name": "Ike", "votes": 10},
// {"name": "Justin", "votes": 1},
// ];
Widget _buildBody(BuildContext context) {
// return _buildList(context, dummySnapshot); 削除
return StreamBuilder<QuerySnapshot>(
stream: Firestore.instance.collection('baby').snapshots(), // babyは各々のコレクションIDに変更してください
builder: (context, snapshot) {
if (!snapshot.hasData) return LinearProgressIndicator();
return _buildList(context, snapshot.data.documents);
},
);
}
// Widget _buildList(BuildContext context, List<Map> snapshot) { 変更
Widget _buildList(BuildContext context, List<DocumentSnapshot> snapshot) {
return ListView(
padding: const EdgeInsets.only(top: 20.0),
children: snapshot.map((data) => _buildListItem(context, data)).toList(),
);
}
// Widget _buildListItem(BuildContext context, Map data) { 変更
Widget _buildListItem(BuildContext context, DocumentSnapshot data) {
// final record = Record.fromMap(data); 変更
final record = Record.fromSnapshot(data);
return Padding(
key: ValueKey(record.name),
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
child: Container(
decoration: BoxDecoration(
border: Border.all(color: Colors.grey),
borderRadius: BorderRadius.circular(5.0),
),
child: ListTile(
title: Text(record.name),
trailing: Text(record.votes.toString()),
// onTap: () => print(record), 変更
onTap: () => record.reference.updateData({'votes': FieldValue.increment(1)}),
),
),
);
}
firebase_core利用あり
// 削除
// final dummySnapshot = [
// {"name": "Filip", "votes": 15},
// {"name": "Abraham", "votes": 14},
// {"name": "Richard", "votes": 11},
// {"name": "Ike", "votes": 10},
// {"name": "Justin", "votes": 1},
// ];
Widget _buildBody(BuildContext context) {
return StreamBuilder<QuerySnapshot>(
stream: FirebaseFirestore.instance.collection('baby').snapshots(), // babyは各々のコレクションIDに変更してください
builder: (context, snapshot) {
if (!snapshot.hasData) return LinearProgressIndicator();
return _buildList(context, snapshot.data.docs);
},
);
}
// Widget _buildList(BuildContext context, List<Map> snapshot) { 変更
Widget _buildList(BuildContext context, List<DocumentSnapshot> snapshot) {
return ListView(
padding: const EdgeInsets.only(top: 20.0),
children: snapshot.map((data) => _buildListItem(context, data)).toList(),
);
}
// Widget _buildListItem(BuildContext context, Map data) { 変更
Widget _buildListItem(BuildContext context, DocumentSnapshot data) {
// final record = Record.fromMap(data); 変更
final record = Record.fromSnapshot(data);
return Padding(
key: ValueKey(record.name),
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
child: Container(
decoration: BoxDecoration(
border: Border.all(color: Colors.grey),
borderRadius: BorderRadius.circular(5.0),
),
child: ListTile(
title: Text(record.name),
trailing: Text(record.votes.toString()),
// onTap: () => print(record), 変更
onTap: () => record.reference.update({'votes': FieldValue.increment(1)}),
),
),
);
}
}
以上で完了です。
アプリを起動し、Databaseとアプリのデータが連動していることを確認してみてください。