Add basic infinite scrolling (still has bugs)
continuous-integration/drone/pr Build is failing
Details
continuous-integration/drone/pr Build is failing
Details
This commit is contained in:
parent
ea8ba3cfd9
commit
53dfe7327b
|
@ -7,6 +7,8 @@ class Client {
|
|||
final JsonEncoder _encoder = new JsonEncoder();
|
||||
final String _token;
|
||||
final String _base;
|
||||
int _maxPages;
|
||||
int get maxPages => _maxPages;
|
||||
|
||||
String get base => _base;
|
||||
|
||||
|
@ -69,6 +71,7 @@ class Client {
|
|||
throw new ApiException(
|
||||
response.statusCode, response.request.url.toString());
|
||||
}
|
||||
_maxPages = response.headers["x-pagination-total-pages"] != null ? int.parse(response.headers["x-pagination-total-pages"]) : 0;
|
||||
return _decoder.convert(response.body);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,6 +4,8 @@ import 'package:meta/meta.dart';
|
|||
class APIService {
|
||||
final Client _client;
|
||||
|
||||
int get maxPages => _client.maxPages;
|
||||
|
||||
@protected
|
||||
Client get client => _client;
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ class _ListPageState extends State<ListPage> {
|
|||
List<Task> _tasks = [];
|
||||
List<Task> _loadingTasks = [];
|
||||
bool _loading = true;
|
||||
int _currentPage = 1;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
|
@ -54,12 +55,20 @@ class _ListPageState extends State<ListPage> {
|
|||
body: !this._loading
|
||||
? RefreshIndicator(
|
||||
child: _tasks.length > 0
|
||||
? ListView(
|
||||
padding: EdgeInsets.symmetric(vertical: 8.0),
|
||||
children: ListTile.divideTiles(
|
||||
context: context, tiles: _listTasks())
|
||||
.toList(),
|
||||
)
|
||||
? ListView.builder(
|
||||
padding: EdgeInsets.symmetric(vertical: 8.0),
|
||||
itemBuilder: (context, i) {
|
||||
if (i.isOdd) return Divider();
|
||||
|
||||
final index = i ~/ 2;
|
||||
if (index >= _tasks.length && VikunjaGlobal.of(context).taskService.maxPages < _currentPage) {
|
||||
_currentPage++;
|
||||
_loadTasksForPage(_currentPage);
|
||||
}
|
||||
return TaskTile(
|
||||
task: _tasks[index],
|
||||
);
|
||||
})
|
||||
: Center(child: Text('This list is empty.')),
|
||||
onRefresh: _loadList,
|
||||
)
|
||||
|
@ -95,13 +104,17 @@ class _ListPageState extends State<ListPage> {
|
|||
setState(() {
|
||||
_loading = false;
|
||||
_list = list;
|
||||
// Load tasks
|
||||
VikunjaGlobal.of(context).taskService.getAll(
|
||||
list.id, {"sort_by": "done", "order_by": "asc"}).then((tasks) {
|
||||
setState(() {
|
||||
_tasks = tasks;
|
||||
});
|
||||
});
|
||||
});
|
||||
_loadTasksForPage(_currentPage);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _loadTasksForPage(int page) {
|
||||
return VikunjaGlobal.of(context).taskService.getAll(
|
||||
_list.id, {"sort_by": "done", "order_by": "asc", "page": page.toString()}).then((tasks) {
|
||||
setState(() {
|
||||
_loading = false;
|
||||
_tasks.addAll(tasks);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -140,6 +140,9 @@ class MockedTaskService implements TaskService {
|
|||
Future<List<Task>> getAll(int listId, [Map<String, String> queryParameters]) {
|
||||
return Future.value(_tasks.values.toList());
|
||||
}
|
||||
|
||||
@override
|
||||
int get maxPages => 1;
|
||||
}
|
||||
|
||||
class MockedUserService implements UserService {
|
||||
|
|
|
@ -27,6 +27,8 @@ abstract class TaskService {
|
|||
Future delete(int taskId);
|
||||
Future<Task> add(int listId, Task task);
|
||||
Future<List<Task>> getAll(int listId, [Map<String, String> queryParameters]);
|
||||
// TODO: Avoid having to add this to each abstract class
|
||||
int get maxPages;
|
||||
}
|
||||
|
||||
abstract class UserService {
|
||||
|
|
Reference in New Issue