firebase / FirebaseUI-Flutter

Apache License 2.0
92 stars 79 forks source link

🐛 All data is loaded at once when using StreamBuilder inside the itemBuilder #215

Closed quibenefacit closed 6 months ago

quibenefacit commented 6 months ago

Is there an existing issue for this?

What plugin is this bug for?

Firebase UI Database

What platform(s) does this bug affect?

Android, iOS

List of dependencies used.

flutter pub deps -s list
 Dart SDK 3.2.3
Flutter SDK 3.16.4

dependencies:
- firebase_auth 4.15.3
  - firebase_auth_platform_interface ^7.0.9
  - firebase_auth_web ^5.8.12
  - firebase_core ^2.24.2
  - firebase_core_platform_interface ^5.0.0
  - flutter any
  - meta ^1.8.0
- firebase_core 2.24.2
  - firebase_core_platform_interface ^5.0.0
  - firebase_core_web ^2.10.0
  - flutter any
  - meta ^1.8.0
- firebase_database 10.3.8
  - firebase_core ^2.24.2
  - firebase_core_platform_interface ^5.0.0
  - firebase_database_platform_interface ^0.2.5+16
  - firebase_database_web ^0.2.3+16
  - flutter any
- flutter 0.0.0
  - characters 1.3.0
  - collection 1.18.0
  - material_color_utilities 0.5.0
  - meta 1.10.0
  - vector_math 2.1.4
  - web 0.3.0
  - sky_engine any
- flutter_localizations 0.0.0
  - flutter any
  - intl 0.18.1
  - characters 1.3.0
  - clock 1.1.1
  - collection 1.18.0
  - material_color_utilities 0.5.0
  - meta 1.10.0
  - path 1.8.3
  - vector_math 2.1.4
  - web 0.3.0
- contacts_service 0.6.3
  - flutter any
  - collection ^1.15.0
  - quiver ^3.0.0
- permission_handler 11.1.0
  - flutter any
  - meta ^1.7.0
  - permission_handler_android ^12.0.1
  - permission_handler_apple ^9.2.0
  - permission_handler_html ^0.1.0+1
  - permission_handler_windows ^0.2.0
  - permission_handler_platform_interface ^4.0.2
- multi_select_flutter 4.1.3
  - flutter any
  - collection ^1.15.0
- currency_text_input_formatter 2.1.11
  - flutter any
  - intl ^0.18.0
- url_launcher 6.2.2
  - flutter any
  - url_launcher_android ^6.2.0
  - url_launcher_ios ^6.2.0
  - url_launcher_linux ^3.1.0
  - url_launcher_macos ^3.1.0
  - url_launcher_platform_interface ^2.2.0
  - url_launcher_web ^2.2.0
  - url_launcher_windows ^3.1.0
- package_info_plus 5.0.1
  - ffi ^2.0.1
  - flutter any
  - flutter_web_plugins any
  - http >=0.13.5 <2.0.0
  - meta ^1.8.0
  - path ^1.8.2
  - package_info_plus_platform_interface ^2.0.1
  - web >=0.3.0 <0.5.0
  - win32 >=4.0.0 <6.0.0
- firebase_storage 11.5.6
  - firebase_core ^2.24.2
  - firebase_core_platform_interface ^5.0.0
  - firebase_storage_platform_interface ^5.1.3
  - firebase_storage_web ^3.6.17
  - flutter any
- image_picker 1.0.5
  - flutter any
  - image_picker_android ^0.8.7
  - image_picker_for_web >=2.2.0 <4.0.0
  - image_picker_ios ^0.8.8
  - image_picker_linux ^0.2.1
  - image_picker_macos ^0.2.1
  - image_picker_platform_interface ^2.8.0
  - image_picker_windows ^0.2.1
- mask_text_input_formatter 2.7.0
  - flutter any
- provider 6.1.1
  - collection ^1.15.0
  - flutter any
  - nested ^1.0.0
- intl 0.18.1
  - clock ^1.1.0
  - meta ^1.0.2
  - path ^1.8.0
- restart_app 1.2.1
  - flutter any
  - plugin_platform_interface ^2.1.4
  - flutter_web_plugins any
- firebase_messaging 14.7.9
  - firebase_core ^2.24.2
  - firebase_core_platform_interface ^5.0.0
  - firebase_messaging_platform_interface ^4.5.18
  - firebase_messaging_web ^3.5.18
  - flutter any
  - meta ^1.8.0
- flutter_app_badger 1.5.0
  - flutter any
- camera 0.10.5+7
  - camera_android ^0.10.7
  - camera_avfoundation ^0.9.13
  - camera_platform_interface ^2.5.0
  - camera_web ^0.3.1
  - flutter any
  - flutter_plugin_android_lifecycle ^2.0.2
- video_compress 3.1.2
  - flutter any
- cached_video_player 2.0.4
  - meta ^1.7.0
  - video_player_platform_interface ^5.1.2
  - video_player_web ^2.0.10
  - flutter any
  - flutter_test any
- visibility_detector 0.4.0+2
  - flutter any
- profanity_filter 2.0.0
- firebase_ui_database 1.3.13
  - collection ^1.18.0
  - firebase_database ^10.3.6
  - firebase_ui_localizations ^1.9.0
  - flutter any

dev dependencies:
- flutter_test 0.0.0
  - flutter any
  - test_api 0.6.1
  - matcher 0.12.16
  - path 1.8.3
  - fake_async 1.3.1
  - clock 1.1.1
  - stack_trace 1.11.1
  - vector_math 2.1.4
  - async 2.11.0
  - boolean_selector 2.1.1
  - characters 1.3.0
  - collection 1.18.0
  - material_color_utilities 0.5.0
  - meta 1.10.0
  - source_span 1.10.0
  - stream_channel 2.1.2
  - string_scanner 1.2.0
  - term_glyph 1.2.1
  - web 0.3.0
- flutter_lints 3.0.1
  - lints ^3.0.0

transitive dependencies:
- _flutterfire_internals 1.3.16
  - collection ^1.0.0
  - firebase_core ^2.24.2
  - firebase_core_platform_interface ^5.0.0
  - flutter any
  - meta ^1.8.0
- async 2.11.0
  - collection ^1.15.0
  - meta ^1.1.7
- boolean_selector 2.1.1
  - source_span ^1.8.0
  - string_scanner ^1.1.0
- camera_android 0.10.8+15
  - camera_platform_interface ^2.5.0
  - flutter any
  - flutter_plugin_android_lifecycle ^2.0.2
  - stream_transform ^2.0.0
- camera_avfoundation 0.9.13+8
  - camera_platform_interface ^2.4.0
  - flutter any
  - stream_transform ^2.0.0
- camera_platform_interface 2.7.0
  - cross_file ^0.3.1
  - flutter any
  - plugin_platform_interface ^2.1.0
  - stream_transform ^2.0.0
- camera_web 0.3.2+3
  - camera_platform_interface ^2.3.1
  - flutter any
  - flutter_web_plugins any
  - stream_transform ^2.0.0
- characters 1.3.0
- clock 1.1.1
- collection 1.18.0
- cross_file 0.3.3+8
  - meta ^1.3.0
  - web >=0.3.0 <0.5.0
- fake_async 1.3.1
  - clock ^1.1.0
  - collection ^1.15.0
- ffi 2.1.0
- file_selector_linux 0.9.2+1
  - cross_file ^0.3.1
  - file_selector_platform_interface ^2.6.0
  - flutter any
- file_selector_macos 0.9.3+3
  - cross_file ^0.3.1
  - file_selector_platform_interface ^2.6.0
  - flutter any
- file_selector_platform_interface 2.6.1
  - cross_file ^0.3.0
  - flutter any
  - http >=0.13.0 <2.0.0
  - plugin_platform_interface ^2.1.0
- file_selector_windows 0.9.3+1
  - cross_file ^0.3.1
  - file_selector_platform_interface ^2.6.0
  - flutter any
- firebase_auth_platform_interface 7.0.9
  - _flutterfire_internals ^1.3.16
  - collection ^1.16.0
  - firebase_core ^2.24.2
  - flutter any
  - meta ^1.8.0
  - plugin_platform_interface ^2.1.3
- firebase_auth_web 5.8.12
  - firebase_auth_platform_interface ^7.0.9
  - firebase_core ^2.24.2
  - firebase_core_web ^2.10.0
  - flutter any
  - flutter_web_plugins any
  - http_parser ^4.0.0
  - js ^0.6.3
  - meta ^1.8.0
- firebase_core_platform_interface 5.0.0
  - collection ^1.0.0
  - flutter any
  - flutter_test any
  - meta ^1.8.0
  - plugin_platform_interface ^2.1.3
- firebase_core_web 2.10.0
  - firebase_core_platform_interface ^5.0.0
  - flutter any
  - flutter_web_plugins any
  - js ^0.6.3
  - meta ^1.8.0
- firebase_database_platform_interface 0.2.5+16
  - _flutterfire_internals ^1.3.16
  - collection ^1.14.3
  - firebase_core ^2.24.2
  - flutter any
  - meta ^1.8.0
  - plugin_platform_interface ^2.1.3
- firebase_database_web 0.2.3+16
  - firebase_core ^2.24.2
  - firebase_core_web ^2.10.0
  - firebase_database_platform_interface ^0.2.5+16
  - flutter any
  - flutter_web_plugins any
  - js ^0.6.3
- firebase_messaging_platform_interface 4.5.18
  - _flutterfire_internals ^1.3.16
  - firebase_core ^2.24.2
  - flutter any
  - meta ^1.8.0
  - plugin_platform_interface ^2.1.3
- firebase_messaging_web 3.5.18
  - _flutterfire_internals ^1.3.16
  - firebase_core ^2.24.2
  - firebase_core_web ^2.10.0
  - firebase_messaging_platform_interface ^4.5.18
  - flutter any
  - flutter_web_plugins any
  - js ^0.6.3
  - meta ^1.8.0
- firebase_storage_platform_interface 5.1.3
  - _flutterfire_internals ^1.3.16
  - collection ^1.15.0
  - firebase_core ^2.24.2
  - flutter any
  - meta ^1.8.0
  - plugin_platform_interface ^2.1.3
- firebase_storage_web 3.6.17
  - _flutterfire_internals ^1.3.16
  - async ^2.5.0
  - firebase_core ^2.24.2
  - firebase_core_web ^2.10.0
  - firebase_storage_platform_interface ^5.1.3
  - flutter any
  - flutter_web_plugins any
  - http >=0.13.0 <2.0.0
  - js ^0.6.3
  - meta ^1.8.0
- firebase_ui_localizations 1.9.0
  - flutter any
  - flutter_localizations any
  - path ^1.8.3
- flutter_plugin_android_lifecycle 2.0.17
  - flutter any
- flutter_web_plugins 0.0.0
  - flutter any
  - characters 1.3.0
  - collection 1.18.0
  - material_color_utilities 0.5.0
  - meta 1.10.0
  - vector_math 2.1.4
  - web 0.3.0
- http 1.1.2
  - async ^2.5.0
  - http_parser ^4.0.0
  - meta ^1.3.0
  - web >=0.3.0 <0.5.0
- http_parser 4.0.2
  - collection ^1.15.0
  - source_span ^1.8.0
  - string_scanner ^1.1.0
  - typed_data ^1.3.0
- image_picker_android 0.8.9+1
  - flutter any
  - flutter_plugin_android_lifecycle ^2.0.1
  - image_picker_platform_interface ^2.8.0
- image_picker_for_web 3.0.1
  - flutter any
  - flutter_web_plugins any
  - image_picker_platform_interface ^2.9.0
  - mime ^1.0.4
- image_picker_ios 0.8.9
  - flutter any
  - image_picker_platform_interface ^2.8.0
- image_picker_linux 0.2.1+1
  - file_selector_linux ^0.9.1+3
  - file_selector_platform_interface ^2.2.0
  - flutter any
  - image_picker_platform_interface ^2.8.0
- image_picker_macos 0.2.1+1
  - file_selector_macos ^0.9.1+1
  - file_selector_platform_interface ^2.3.0
  - flutter any
  - image_picker_platform_interface ^2.8.0
- image_picker_platform_interface 2.9.1
  - cross_file ^0.3.1+1
  - flutter any
  - http >=0.13.0 <2.0.0
  - plugin_platform_interface ^2.1.0
- image_picker_windows 0.2.1+1
  - file_selector_platform_interface ^2.2.0
  - file_selector_windows ^0.9.0
  - flutter any
  - image_picker_platform_interface ^2.8.0
- js 0.6.7
  - meta ^1.7.0
- lints 3.0.0
- matcher 0.12.16
  - async ^2.10.0
  - meta ^1.8.0
  - stack_trace ^1.10.0
  - term_glyph ^1.2.0
  - test_api >=0.5.0 <0.7.0
- material_color_utilities 0.5.0
  - collection ^1.15.0
- meta 1.10.0
- mime 1.0.4
- nested 1.0.0
  - flutter any
- package_info_plus_platform_interface 2.0.1
  - flutter any
  - meta ^1.3.0
  - plugin_platform_interface ^2.0.0
- path 1.8.3
- permission_handler_android 12.0.1
  - flutter any
  - permission_handler_platform_interface ^4.0.0
- permission_handler_apple 9.2.0
  - flutter any
  - permission_handler_platform_interface ^4.0.0
- permission_handler_html 0.1.0+2
  - flutter any
  - flutter_web_plugins any
  - permission_handler_platform_interface ^4.0.2
- permission_handler_platform_interface 4.0.2
  - flutter any
  - meta ^1.3.0
  - plugin_platform_interface ^2.0.0
- permission_handler_windows 0.2.0
  - flutter any
  - permission_handler_platform_interface ^4.0.0
- plugin_platform_interface 2.1.7
  - meta ^1.3.0
- quiver 3.2.1
  - matcher ^0.12.10
- sky_engine 0.0.99
- source_span 1.10.0
  - collection ^1.15.0
  - path ^1.8.0
  - term_glyph ^1.2.0
- stack_trace 1.11.1
  - path ^1.8.0
- stream_channel 2.1.2
  - async ^2.5.0
- stream_transform 2.1.0
- string_scanner 1.2.0
  - source_span ^1.8.0
- term_glyph 1.2.1
- test_api 0.6.1
  - async ^2.5.0
  - boolean_selector ^2.1.0
  - collection ^1.15.0
  - meta ^1.3.0
  - source_span ^1.8.0
  - stack_trace ^1.10.0
  - stream_channel ^2.1.0
  - string_scanner ^1.1.0
  - term_glyph ^1.2.0
- typed_data 1.3.2
  - collection ^1.15.0
- url_launcher_android 6.2.0
  - flutter any
  - url_launcher_platform_interface ^2.2.0
- url_launcher_ios 6.2.1
  - flutter any
  - url_launcher_platform_interface ^2.2.0
- url_launcher_linux 3.1.1
  - flutter any
  - url_launcher_platform_interface ^2.2.0
- url_launcher_macos 3.1.0
  - flutter any
  - url_launcher_platform_interface ^2.2.0
- url_launcher_platform_interface 2.2.0
  - flutter any
  - plugin_platform_interface ^2.1.0
- url_launcher_web 2.2.2
  - flutter any
  - flutter_web_plugins any
  - url_launcher_platform_interface ^2.2.0
  - web >=0.3.0 <0.5.0
- url_launcher_windows 3.1.1
  - flutter any
  - url_launcher_platform_interface ^2.2.0
- vector_math 2.1.4
- video_player_platform_interface 5.1.4
  - flutter any
  - plugin_platform_interface ^2.1.0
- video_player_web 2.0.15
  - flutter any
  - flutter_web_plugins any
  - video_player_platform_interface >=4.2.0 <7.0.0
- web 0.3.0
- win32 5.1.1
  - ffi ^2.1.0

Steps to reproduce

I have 4 items in the ENTRIES table. I am trying to download them pageSize at a time (ie, before the user scrolls). As I set pageSize=2, only 2 should be loaded. Instead, all 4 are loaded, as verified by printing the value of index when the widget in itemBuilder finishes loading. My theory is that this undesired behavior happens because I am calling a secondary StreamBuilder inside the itemBuilder. I need to call it in order to look up the item-associated data at another database location. In general, the query parameter doesn't seem to be doing a listen(), only a once() or get(). How to accommodate the case when a listen() is needed?

Here's the code:

@override
  Widget build(BuildContext context) {
    List<String> listTest = [];
    return FirebaseDatabaseListView(
        pageSize: 2,
        reverse: true, // also broken if set to false or omitted
        shrinkWrap: true,
        query: FirebaseDatabase.instance.ref('ENTRIES').orderByKey(),
        itemBuilder: (context, snapshot) {
          final item = snapshot.value as Map<dynamic, dynamic>;
          final testShow = item[KEY_ID];
          WidgetsBinding.instance.addPostFrameCallback((_) {
            // Code to be executed after the child widget has been built
            if (!listTest.contains(testShow)) {
              listTest.add(testShow);
              print('***** LOADED $testShow');
            }
          });
          return StreamBuilder(
              stream: FirebaseDatabase.instance
                  .ref('ENTRIES/${item[KEY_ASSOC]}')
                  .onValue,
              builder: (context, itemSnapshot) {
                if (ConnectionState.waiting == itemSnapshot.connectionState) {
                  return const SizedBox.shrink();
                } else if (itemSnapshot.hasError) {
                  return const ListTile(
                    title: Text('Error loading data'),
                  );
                } else {
                  return ListTile(
                    title: Text('${item[KEY_ASSOC]}'),
                    subtitle: const SizedBox(
                      height: 800,
                    ),
                  );
                }
              });
        });
  }

Expected Behavior

I have 4 items in the ENTRIES table. I am trying to download them pageSize at a time (ie, before the user scrolls). As I list pageSize=2, only 2 should be loaded.

Actual Behavior

Instead, all 4 are loaded, as verified by printing the value of index when the widget in itemBuilder finishes loading.

Additional Information

For testing I've made the items artificially tall (almost as high as the screen) just to make sure that scrolling would be required to load items 3 and 4.

danagbemava-nc commented 6 months ago

Closing this as a duplicate of https://github.com/firebase/FirebaseUI-Flutter/issues/111.

Kindly subscribe to the original issue for updates.

Thank you