diff --git a/docs/firebase-ui-firestore.md b/docs/firebase-ui-firestore.md index ae40a21d..9b554852 100644 --- a/docs/firebase-ui-firestore.md +++ b/docs/firebase-ui-firestore.md @@ -40,7 +40,7 @@ final usersQuery = FirebaseFirestore.instance.collection('users').orderBy('name' FirestoreListView>( query: usersQuery, - itemBuilder: (context, snapshot) { + itemBuilder: (context, snapshot, index) { Map user = snapshot.data(); return Text('User name is ${user['name']}'); @@ -109,7 +109,7 @@ final usersQuery = FirebaseFirestore.instance.collection('users') FirestoreListView( query: usersQuery, - itemBuilder: (context, snapshot) { + itemBuilder: (context, snapshot, index) { // Data is now typed! User user = snapshot.data(); diff --git a/packages/firebase_ui_firestore/example/lib/main.dart b/packages/firebase_ui_firestore/example/lib/main.dart index 2f5ffb08..03b8669a 100644 --- a/packages/firebase_ui_firestore/example/lib/main.dart +++ b/packages/firebase_ui_firestore/example/lib/main.dart @@ -35,7 +35,7 @@ class FirebaseUIFirestoreExample extends StatelessWidget { body: FirestoreListView( query: collection, padding: const EdgeInsets.all(8.0), - itemBuilder: (context, snapshot) { + itemBuilder: (context, snapshot, index) { final user = snapshot.data(); return Column( children: [ diff --git a/packages/firebase_ui_firestore/lib/src/query_builder.dart b/packages/firebase_ui_firestore/lib/src/query_builder.dart index bbf0329e..cd0b31b4 100644 --- a/packages/firebase_ui_firestore/lib/src/query_builder.dart +++ b/packages/firebase_ui_firestore/lib/src/query_builder.dart @@ -359,8 +359,11 @@ class _Sentinel { } /// A type representing the function passed to [FirestoreListView] for its `itemBuilder`. -typedef FirestoreItemBuilder = - Widget Function(BuildContext context, QueryDocumentSnapshot doc); +typedef FirestoreItemBuilder = Widget Function( + BuildContext context, + QueryDocumentSnapshot doc, + int index, +); /// A type representing the function passed to [FirestoreListView] for its `loadingBuilder`. typedef FirestoreLoadingBuilder = Widget Function(BuildContext context); @@ -414,7 +417,7 @@ typedef FirestoreEmptyBuilder = Widget Function(BuildContext context); /// ```dart /// FirestoreListView( /// query: moviesCollection.orderBy('title'), -/// itemBuilder: (context, snapshot) { +/// itemBuilder: (context, snapshot, index) { /// Movie movie = snapshot.data(); /// return Text(movie.title); /// }, @@ -499,7 +502,7 @@ class FirestoreListView extends FirestoreQueryBuilder { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - itemBuilder(context, doc), + itemBuilder(context, doc, index), if (isLastItem && snapshot.hasMore) fetchingIndicatorBuilder?.call(context) ?? const Padding( @@ -516,7 +519,7 @@ class FirestoreListView extends FirestoreQueryBuilder { ], ), ) - : itemBuilder(context, doc); + : itemBuilder(context, doc, index); }, scrollDirection: scrollDirection, reverse: reverse, @@ -611,7 +614,7 @@ class FirestoreListView extends FirestoreQueryBuilder { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - itemBuilder(context, doc), + itemBuilder(context, doc, index), if (isLastItem && snapshot.hasMore) fetchingIndicatorBuilder?.call(context) ?? const Padding( @@ -628,7 +631,7 @@ class FirestoreListView extends FirestoreQueryBuilder { ], ), ) - : itemBuilder(context, doc); + : itemBuilder(context, doc, index); }, separatorBuilder: separatorBuilder, scrollDirection: scrollDirection, diff --git a/tests/integration_test/firebase_ui_firestore/firestore_list_view_test.dart b/tests/integration_test/firebase_ui_firestore/firestore_list_view_test.dart index 876fa427..18c6d762 100644 --- a/tests/integration_test/firebase_ui_firestore/firestore_list_view_test.dart +++ b/tests/integration_test/firebase_ui_firestore/firestore_list_view_test.dart @@ -61,7 +61,8 @@ void main() { body: FirestoreListView( query: collection.orderBy('value'), loadingBuilder: (context) => const Text('loading...'), - itemBuilder: (context, snapshot) => throw UnimplementedError(), + itemBuilder: (context, snapshot, index) => + throw UnimplementedError(), ), ), ), @@ -77,12 +78,14 @@ void main() { ) async { final collection = db.collection('flutter-tests/list-view-builder/works'); - await tester.pumpWidget( - MaterialApp( - home: Scaffold( - body: FirestoreListView( - query: collection.orderBy('value'), - itemBuilder: (context, snapshot) => throw UnimplementedError(), + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: FirestoreListView( + query: collection.orderBy('value'), + itemBuilder: (context, snapshot, index) => + throw UnimplementedError(), + ), ), ), ), @@ -102,7 +105,8 @@ void main() { body: FirestoreListView( query: collection, cacheExtent: 0, - itemBuilder: (context, snapshot) => throw UnimplementedError(), + itemBuilder: (context, snapshot, index) => + throw UnimplementedError(), ), ), ), @@ -130,31 +134,32 @@ void main() { await tester.pumpWidget( MaterialApp( home: Material( - child: Builder( - builder: (context) { - final mq = MediaQuery.of(context); - final h = mq.size.height; - size = h / 5; - - return FirestoreListView( - physics: const ClampingScrollPhysics(), - query: ref.orderBy('value'), - cacheExtent: 0, - pageSize: 5, - itemExtent: size, - itemBuilder: (context, snapshot) { - final v = snapshot.data()['value'] as int; - - return Container( - alignment: Alignment.center, - color: Colors.black.withAlpha(v % 2 == 0 ? 50 : 100), - key: ValueKey(v.toString()), - child: Text(v.toString(), textAlign: TextAlign.center), - ); - }, - ); - }, - ), + child: Builder(builder: (context) { + final mq = MediaQuery.of(context); + final h = mq.size.height; + size = h / 5; + + return FirestoreListView( + physics: const ClampingScrollPhysics(), + query: ref.orderBy('value'), + cacheExtent: 0, + pageSize: 5, + itemExtent: size, + itemBuilder: (context, snapshot, index) { + final v = snapshot.data()['value'] as int; + + return Container( + alignment: Alignment.center, + color: Colors.black.withAlpha(v % 2 == 0 ? 50 : 100), + key: ValueKey(v.toString()), + child: Text( + v.toString(), + textAlign: TextAlign.center, + ), + ); + }, + ); + }), ), ), ); @@ -201,7 +206,11 @@ void main() { } class ListViewBuilderSpy extends Mock { - Widget call(BuildContext? context, T? snapshot) { + Widget call( + BuildContext? context, + T? snapshot, + int? index, + ) { return super.noSuchMethod( Invocation.method(#call, [context, snapshot]), returnValueForMissingStub: Container(),