Skip to content

Commit 20ac288

Browse files
added provider to listen firebase changes
1 parent b69aa14 commit 20ac288

File tree

5 files changed

+55
-7
lines changed

5 files changed

+55
-7
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ This app is used to test the following features:
88
- ```Clean DB``` - removes all tables from SQLite database and creates them again;
99
- ```Old Json Caching Example``` - fetching data from REST API and caching into SQLite;
1010

11-
- Firebase notifications are also enabled. FCM token is shown in debug console at startup. Copy the token and go to "Cloud messaging" in Firebase console to test in out.
11+
- Firebase notifications are also enabled. FCM token is shown in debug console at startup. Copy the token and go to "Cloud messaging" in Firebase console to test it out.
1212

lib/backend/firestore_changes.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import 'package:cloud_firestore/cloud_firestore.dart';
2+
import 'package:flutter/foundation.dart';
3+
4+
class FirestoreChanges extends ChangeNotifier {
5+
String changeStr = '';
6+
7+
void listenOnFirestoreChanges() {
8+
FirebaseFirestore.instance
9+
.collection('flutter-caching')
10+
.snapshots()
11+
.listen((event) {
12+
changeStr = '';
13+
for (var change in event.docChanges) {
14+
// print('Change type: ${change.type}; Data: '
15+
// '${change.doc.data()}\n');
16+
changeStr = changeStr +
17+
'Change type: ${change.type};\n'
18+
'Doc ID: ${change.doc.id}\n'
19+
'Data: ${change.doc.data()}\n';
20+
}
21+
notifyListeners();
22+
// changeStr = '';
23+
});
24+
}
25+
}

lib/main.dart

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:fetchingapp/backend/firestore_changes.dart';
12
import 'package:fetchingapp/backend/notifications.dart';
23
import 'package:fetchingapp/screens/home.dart';
34
import 'package:fetchingapp/screens/login.dart';
@@ -13,6 +14,7 @@ Future<void> main() async {
1314
await Firebase.initializeApp();
1415

1516
initializeMessaging();
17+
// listenOnFirestoreChanges();
1618

1719
var token = await FirebaseMessaging.instance.getToken();
1820
print('FCM token: $token');
@@ -49,11 +51,16 @@ class _MyAppState extends State<MyApp> {
4951
firstScreen = const LoginPage();
5052
}
5153

52-
return MaterialApp(
53-
theme: ThemeData(
54-
primarySwatch: Colors.blue,
54+
55+
56+
return ChangeNotifierProvider(
57+
create: (_) => FirestoreChanges(),
58+
child: MaterialApp(
59+
theme: ThemeData(
60+
primarySwatch: Colors.blue,
61+
),
62+
home: firstScreen,
5563
),
56-
home: firstScreen,
5764
);
5865
}
5966
}

lib/screens/home.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:fetchingapp/backend/database.dart';
2+
import 'package:fetchingapp/backend/firestore_changes.dart';
23
import 'package:fetchingapp/backend/google_authentication.dart';
34
import 'package:fetchingapp/screens/firestore_stream.dart';
45
import 'package:fetchingapp/screens/firestore_future.dart';
@@ -7,6 +8,7 @@ import 'package:fetchingapp/screens/login.dart';
78
import 'package:fetchingapp/screens/provider_test.dart';
89
import 'package:firebase_auth/firebase_auth.dart';
910
import 'package:flutter/material.dart';
11+
import 'package:provider/provider.dart';
1012

1113
class HomePage extends StatelessWidget {
1214
const HomePage(this.user, {Key? key}) : super(key: key);
@@ -15,6 +17,9 @@ class HomePage extends StatelessWidget {
1517

1618
@override
1719
Widget build(BuildContext context) {
20+
Provider.of<FirestoreChanges>(context, listen: false)
21+
.listenOnFirestoreChanges();
22+
1823
return Scaffold(
1924
appBar: AppBar(
2025
automaticallyImplyLeading: false,
@@ -27,7 +32,7 @@ class HomePage extends StatelessWidget {
2732
const SizedBox(height: 10),
2833
testSectionButton(
2934
context: context,
30-
name: 'Provider Test',
35+
name: 'Simple Provider Test',
3136
widget: const ProviderTestPage()),
3237
const SizedBox(height: 10),
3338
testSectionButton(

lib/screens/provider_test.dart

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:fetchingapp/backend/firestore_changes.dart';
12
import 'package:flutter/material.dart';
23
import 'package:provider/provider.dart';
34

@@ -22,8 +23,18 @@ class _ProviderTestPageState extends State<ProviderTestPage> {
2223
const Button(fruit: 'Orange'),
2324
const Button(fruit: 'Banana'),
2425
Text(
25-
'My favorite fruit is: ' + Provider.of<Favorites>(context).fruit,
26+
'My favorite fruit is: ' +
27+
Provider.of<Favorites>(context).fruit +
28+
'\n\n',
2629
style: const TextStyle(fontSize: 25),
30+
),
31+
const Text(
32+
'Firestore Listener Provider:',
33+
style: TextStyle(fontSize: 25),
34+
),
35+
Text(
36+
'\n' + Provider.of<FirestoreChanges>(context).changeStr,
37+
style: const TextStyle(fontSize: 15),
2738
)
2839
],
2940
),

0 commit comments

Comments
 (0)