From 942002b073eafca1f4b510b7abc1e0fbb150e66f Mon Sep 17 00:00:00 2001 From: jt274 <47506129+jt274@users.noreply.github.com> Date: Wed, 30 Apr 2025 12:13:58 -0500 Subject: [PATCH 1/2] Expose index to FirestoreItemBuilder Exposes itemBuilder index in FirestoreListView and FirestoreListView.separated to be consistent with flutter ListView.builder and ListView.separated. --- .../firebase_ui_firestore/lib/src/query_builder.dart | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/firebase_ui_firestore/lib/src/query_builder.dart b/packages/firebase_ui_firestore/lib/src/query_builder.dart index e0c9c5fc..22426779 100644 --- a/packages/firebase_ui_firestore/lib/src/query_builder.dart +++ b/packages/firebase_ui_firestore/lib/src/query_builder.dart @@ -4,10 +4,10 @@ import 'dart:async'; +import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_ui_shared/firebase_ui_shared.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; -import 'package:cloud_firestore/cloud_firestore.dart'; /// A function that builds a widget from a [FirestoreQueryBuilderSnapshot] /// @@ -354,6 +354,7 @@ class _Sentinel { typedef FirestoreItemBuilder = Widget Function( BuildContext context, QueryDocumentSnapshot doc, + int index, ); /// A type representing the function passed to [FirestoreListView] for its `loadingBuilder`. @@ -496,7 +497,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( @@ -513,7 +514,7 @@ class FirestoreListView extends FirestoreQueryBuilder { ], ), ) - : itemBuilder(context, doc); + : itemBuilder(context, doc, index); }, scrollDirection: scrollDirection, reverse: reverse, @@ -606,7 +607,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( @@ -623,7 +624,7 @@ class FirestoreListView extends FirestoreQueryBuilder { ], ), ) - : itemBuilder(context, doc); + : itemBuilder(context, doc, index); }, separatorBuilder: separatorBuilder, scrollDirection: scrollDirection, From 55fa64c9faee9438337f12d2452a8f3a29039c2f Mon Sep 17 00:00:00 2001 From: jt274 <47506129+jt274@users.noreply.github.com> Date: Wed, 30 Apr 2025 12:36:40 -0500 Subject: [PATCH 2/2] Fix tests, doc, example --- .../firebase_ui_firestore/example/lib/main.dart | 2 +- .../lib/src/query_builder.dart | 2 +- .../firestore_list_view_test.dart | 15 ++++++++++----- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/firebase_ui_firestore/example/lib/main.dart b/packages/firebase_ui_firestore/example/lib/main.dart index 50fe4ed0..2854e830 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 22426779..3de47c9e 100644 --- a/packages/firebase_ui_firestore/lib/src/query_builder.dart +++ b/packages/firebase_ui_firestore/lib/src/query_builder.dart @@ -413,7 +413,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); /// }, 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 392748f1..f0017754 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 @@ -3,10 +3,11 @@ // BSD-style license that can be found in the LICENSE file. import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:firebase_ui_firestore/firebase_ui_firestore.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:firebase_ui_firestore/firebase_ui_firestore.dart'; import 'package:mockito/mockito.dart'; + import '../utils.dart'; void main() { @@ -61,7 +62,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(), ), ), ), @@ -84,7 +86,8 @@ void main() { home: Scaffold( body: FirestoreListView( query: collection.orderBy('value'), - itemBuilder: (context, snapshot) => throw UnimplementedError(), + itemBuilder: (context, snapshot, index) => + throw UnimplementedError(), ), ), ), @@ -105,7 +108,8 @@ void main() { body: FirestoreListView( query: collection, cacheExtent: 0, - itemBuilder: (context, snapshot) => throw UnimplementedError(), + itemBuilder: (context, snapshot, index) => + throw UnimplementedError(), ), ), ), @@ -144,7 +148,7 @@ void main() { cacheExtent: 0, pageSize: 5, itemExtent: size, - itemBuilder: (context, snapshot) { + itemBuilder: (context, snapshot, index) { final v = snapshot.data()['value'] as int; return Container( @@ -208,6 +212,7 @@ class ListViewBuilderSpy extends Mock { Widget call( BuildContext? context, T? snapshot, + int? index, ) { return super.noSuchMethod( Invocation.method(#call, [context, snapshot]),