Add basic infinite scrolling (still has bugs)
continuous-integration/drone/pr Build is failing Details

This commit is contained in:
kolaente 2020-01-15 22:59:07 +01:00
parent ea8ba3cfd9
commit 53dfe7327b
Signed by: konrad
GPG Key ID: F40E70337AB24C9B
5 changed files with 36 additions and 13 deletions

View File

@ -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);
}
}

View File

@ -4,6 +4,8 @@ import 'package:meta/meta.dart';
class APIService {
final Client _client;
int get maxPages => _client.maxPages;
@protected
Client get client => _client;

View File

@ -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);
});
});
}

View File

@ -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 {

View File

@ -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 {