Expose `path` string to DocumentSnapshot (#244) * Pass a `path` variable that can resolve to a DocumentReference to DocumentSnapshot * Added `path` to all other calls to DocumentSnapshot. * document_change.dart nit * query_snapshot.dart nitpick * Fixing nits and adding a documentID getter * Changed final "reference" to "path" * Untested attempt at Objective-C implementation * Newline nit * VSC added spaces :( * Update pubspec.yaml * Update CHANGELOG.md
diff --git a/packages/firebase_firestore/CHANGELOG.md b/packages/firebase_firestore/CHANGELOG.md index f956327..f824c41 100644 --- a/packages/firebase_firestore/CHANGELOG.md +++ b/packages/firebase_firestore/CHANGELOG.md
@@ -1,3 +1,7 @@ +## 0.0.2 + +* Add path property to DocumentSnapshot + ## 0.0.1+1 * Update project homepage
diff --git a/packages/firebase_firestore/android/src/main/java/io/flutter/plugins/firebase/firestore/FirestorePlugin.java b/packages/firebase_firestore/android/src/main/java/io/flutter/plugins/firebase/firestore/FirestorePlugin.java index bf520ec..153b889 100644 --- a/packages/firebase_firestore/android/src/main/java/io/flutter/plugins/firebase/firestore/FirestorePlugin.java +++ b/packages/firebase_firestore/android/src/main/java/io/flutter/plugins/firebase/firestore/FirestorePlugin.java
@@ -74,8 +74,10 @@ arguments.put("handle", handle); if (documentSnapshot.exists()) { arguments.put("data", documentSnapshot.getData()); + arguments.put("path", documentSnapshot.getReference().getPath()); } else { arguments.put("data", null); + arguments.put("path", documentSnapshot.getReference().getPath()); } channel.invokeMethod("DocumentSnapshot", arguments); } @@ -93,10 +95,13 @@ Map<String, Object> arguments = new HashMap<>(); arguments.put("handle", handle); + List<String> paths = new ArrayList<>(); List<Map<String, Object>> documents = new ArrayList<>(); for (DocumentSnapshot document : querySnapshot.getDocuments()) { + paths.add(document.getReference().getPath()); documents.add(document.getData()); } + arguments.put("paths", paths); arguments.put("documents", documents); List<Map<String, Object>> documentChanges = new ArrayList<>(); @@ -118,6 +123,7 @@ change.put("oldIndex", documentChange.getOldIndex()); change.put("newIndex", documentChange.getNewIndex()); change.put("document", documentChange.getDocument().getData()); + change.put("path", documentChange.getDocument().getReference().getPath()); documentChanges.add(change); } arguments.put("documentChanges", documentChanges);
diff --git a/packages/firebase_firestore/ios/Classes/FirestorePlugin.m b/packages/firebase_firestore/ios/Classes/FirestorePlugin.m index 7a8d2f3..0b97987 100644 --- a/packages/firebase_firestore/ios/Classes/FirestorePlugin.m +++ b/packages/firebase_firestore/ios/Classes/FirestorePlugin.m
@@ -67,8 +67,10 @@ id<FIRListenerRegistration> listener = [getQuery(call.arguments) addSnapshotListener:^(FIRQuerySnapshot *_Nullable snapshot, NSError *_Nullable error) { if (error) result(error.flutterError); + NSMutableArray *paths = [NSMutableArray array]; NSMutableArray *documents = [NSMutableArray array]; for (FIRDocumentSnapshot *document in snapshot.documents) { + [paths addObject:document.reference.path]; [documents addObject:document.data]; } NSMutableArray *documentChanges = [NSMutableArray array]; @@ -88,6 +90,7 @@ [documentChanges addObject:@{ @"type" : type, @"document" : documentChange.document.data, + @"path" : documentChange.document.reference.path, @"oldIndex" : [NSNumber numberWithUnsignedInteger:documentChange.oldIndex], @"newIndex" : [NSNumber numberWithUnsignedInteger:documentChange.newIndex], }]; @@ -95,6 +98,7 @@ [self.channel invokeMethod:@"QuerySnapshot" arguments:@{ @"handle" : handle, + @"paths" : paths, @"documents" : documents, @"documentChanges" : documentChanges }]; @@ -111,6 +115,7 @@ [self.channel invokeMethod:@"DocumentSnapshot" arguments:@{ @"handle" : handle, + @"path" : snapshot.reference.path, @"data" : snapshot.exists ? snapshot.data : [NSNull null], }]; }];
diff --git a/packages/firebase_firestore/lib/src/document_change.dart b/packages/firebase_firestore/lib/src/document_change.dart index e7cf80f..8a7f101 100644 --- a/packages/firebase_firestore/lib/src/document_change.dart +++ b/packages/firebase_firestore/lib/src/document_change.dart
@@ -26,7 +26,10 @@ DocumentChange._(Map<String, dynamic> data) : oldIndex = data['oldIndex'], newIndex = data['newIndex'], - document = new DocumentSnapshot._(data['document']), + document = new DocumentSnapshot._( + data['path'], + data['document'], + ), type = DocumentChangeType.values.firstWhere((DocumentChangeType type) { return type.toString() == data['type']; });
diff --git a/packages/firebase_firestore/lib/src/document_snapshot.dart b/packages/firebase_firestore/lib/src/document_snapshot.dart index 13e1484..a02ebf8 100644 --- a/packages/firebase_firestore/lib/src/document_snapshot.dart +++ b/packages/firebase_firestore/lib/src/document_snapshot.dart
@@ -10,11 +10,17 @@ /// The data can be extracted with the data property or by using subscript /// syntax to access a specific field. class DocumentSnapshot { + /// Represents the document's reference + final String path; + /// Contains all the data of this snapshot final Map<String, dynamic> data; - DocumentSnapshot._(this.data); + DocumentSnapshot._(this.path, this.data); /// Reads individual values from the snapshot dynamic operator [](String key) => data[key]; + + /// Returns the ID of the snapshot's document + String get documentID => path.split('/').last; }
diff --git a/packages/firebase_firestore/lib/src/firestore.dart b/packages/firebase_firestore/lib/src/firestore.dart index e4537da..d5c902e 100644 --- a/packages/firebase_firestore/lib/src/firestore.dart +++ b/packages/firebase_firestore/lib/src/firestore.dart
@@ -26,6 +26,7 @@ _queryObservers[call.arguments['handle']].add(snapshot); } else if (call.method == 'DocumentSnapshot') { final DocumentSnapshot snapshot = new DocumentSnapshot._( + call.arguments['path'], call.arguments['data'], ); _documentObservers[call.arguments['handle']].add(snapshot);
diff --git a/packages/firebase_firestore/lib/src/query_snapshot.dart b/packages/firebase_firestore/lib/src/query_snapshot.dart index 333b321..6f80abc 100644 --- a/packages/firebase_firestore/lib/src/query_snapshot.dart +++ b/packages/firebase_firestore/lib/src/query_snapshot.dart
@@ -13,10 +13,13 @@ /// is the first snapshot, all documents will be in the list as Added changes. final List<DocumentChange> documentChanges; - QuerySnapshot._(Map<String, List<Map<String, dynamic>>> data) + QuerySnapshot._(Map<String, List<dynamic>> data) : documents = new List<DocumentSnapshot>.generate( data['documents'].length, (int index) { - return new DocumentSnapshot._(data['documents'][index]); + return new DocumentSnapshot._( + data['paths'][index], + data['documents'][index], + ); }), documentChanges = new List<DocumentChange>.generate( data['documentChanges'].length, (int index) {
diff --git a/packages/firebase_firestore/pubspec.yaml b/packages/firebase_firestore/pubspec.yaml index 0a33ea9..616e510 100755 --- a/packages/firebase_firestore/pubspec.yaml +++ b/packages/firebase_firestore/pubspec.yaml
@@ -3,7 +3,7 @@ description: Firestore plugin for Flutter. author: Flutter Team <flutter-dev@googlegroups.com> homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_firestore -version: 0.0.1+1 +version: 0.0.2 flutter: plugin: