diff --git a/lib/src/utils/parse_live_list.dart b/lib/src/utils/parse_live_list.dart index 1734e87d7..7f36b36f9 100644 --- a/lib/src/utils/parse_live_list.dart +++ b/lib/src/utils/parse_live_list.dart @@ -6,19 +6,23 @@ import '../../parse_server_sdk.dart'; // ignore_for_file: invalid_use_of_protected_member class ParseLiveList { - ParseLiveList._(this._query, this._listeningIncludes); + ParseLiveList._(this._query, this._listeningIncludes, this._lazyLoading) { + _debug = isDebugEnabled(); + } static Future> create( QueryBuilder _query, {bool listenOnAllSubItems, - List listeningIncludes}) { + List listeningIncludes, + bool lazyLoading = true}) { final ParseLiveList parseLiveList = ParseLiveList._( _query, listenOnAllSubItems == true ? _toIncludeMap( _query.limiters['include']?.toString()?.split(',') ?? []) - : _toIncludeMap(listeningIncludes ?? [])); + : _toIncludeMap(listeningIncludes ?? []), + lazyLoading); return parseLiveList._init().then((_) { return parseLiveList; @@ -28,6 +32,7 @@ class ParseLiveList { List> _list = List>(); StreamController> _eventStreamController; int _nextID = 0; + bool _debug; /// is object1 listed after object2? /// can return null @@ -89,6 +94,8 @@ class ParseLiveList { //The included Items, where LiveList should look for updates. final Map _listeningIncludes; + final bool _lazyLoading; + int get size { return _list.length; } @@ -122,18 +129,21 @@ class ParseLiveList { Future _runQuery() async { final QueryBuilder query = QueryBuilder.copy(_query); - if (query.limiters.containsKey('order')) { - query.keysToReturn( - query.limiters['order'].toString().split(',').map((String string) { - if (string.startsWith('-')) { - return string.substring(1); - } - return string; - }).toList()); - } else { - query.keysToReturn(List()); + if (_debug) + print('ParseLiveList: lazyLoading is ${_lazyLoading ? 'on' : 'off'}'); + if (_lazyLoading) { + if (query.limiters.containsKey('order')) { + query.keysToReturn( + query.limiters['order'].toString().split(',').map((String string) { + if (string.startsWith('-')) { + return string.substring(1); + } + return string; + }).toList()); + } else { + query.keysToReturn(List()); + } } - return await query.query(); } @@ -145,7 +155,8 @@ class ParseLiveList { _list = parseResponse.results ?.map>((dynamic element) => ParseLiveListElement(element, - updatedSubItems: _listeningIncludes)) + updatedSubItems: _listeningIncludes, + loaded: !_lazyLoading)) ?.toList() ?? List>(); } @@ -748,6 +759,7 @@ class ParseLiveListWidget extends StatefulWidget { this.removedItemBuilder, this.listenOnAllSubItems, this.listeningIncludes, + this.lazyLoading = true, }) : super(key: key); final QueryBuilder query; @@ -768,12 +780,15 @@ class ParseLiveListWidget extends StatefulWidget { final bool listenOnAllSubItems; final List listeningIncludes; + final bool lazyLoading; + @override _ParseLiveListWidgetState createState() => _ParseLiveListWidgetState( query: query, removedItemBuilder: removedItemBuilder, listenOnAllSubItems: listenOnAllSubItems, listeningIncludes: listeningIncludes, + lazyLoading: lazyLoading, ); static Widget defaultChildBuilder( @@ -802,11 +817,13 @@ class _ParseLiveListWidgetState {@required this.query, @required this.removedItemBuilder, bool listenOnAllSubItems, - List listeningIncludes}) { + List listeningIncludes, + bool lazyLoading = true}) { ParseLiveList.create( query, listenOnAllSubItems: listenOnAllSubItems, listeningIncludes: listeningIncludes, + lazyLoading: lazyLoading, ).then((ParseLiveList value) { setState(() { _liveList = value;