Re-implemented getting tasks with the new seperate endpoint #39
|
@ -1,12 +1,14 @@
|
|||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:vikunja_app/components/AddDialog.dart';
|
||||
import 'package:vikunja_app/components/TaskTile.dart';
|
||||
import 'package:vikunja_app/global.dart';
|
||||
import 'package:vikunja_app/models/list.dart';
|
||||
import 'package:vikunja_app/models/task.dart';
|
||||
import 'package:vikunja_app/pages/list/list_edit.dart';
|
||||
import 'package:vikunja_app/stores/list_store.dart';
|
||||
|
||||
class ListPage extends StatefulWidget {
|
||||
final TaskList taskList;
|
||||
|
@ -21,23 +23,18 @@ class _ListPageState extends State<ListPage> {
|
|||
TaskList _list;
|
||||
List<Task> _tasks = [];
|
||||
List<Task> _loadingTasks = [];
|
||||
bool _loading = true;
|
||||
int _currentPage = 1;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_list = TaskList(id: widget.taskList.id, title: widget.taskList.title);
|
||||
Future.microtask(() => _loadList());
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
void didChangeDependencies() {
|
||||
super.didChangeDependencies();
|
||||
_loadList();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final taskState = Provider.of<ListProvider>(context);
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: new Text(_list.title),
|
||||
|
@ -52,9 +49,9 @@ class _ListPageState extends State<ListPage> {
|
|||
))))
|
||||
],
|
||||
),
|
||||
body: !this._loading
|
||||
body: !taskState.isLoading
|
||||
? RefreshIndicator(
|
||||
child: _tasks.length > 0
|
||||
child: taskState.tasks.length > 0
|
||||
? ListView.builder(
|
||||
padding: EdgeInsets.symmetric(vertical: 8.0),
|
||||
itemBuilder: (context, i) {
|
||||
|
@ -65,9 +62,9 @@ class _ListPageState extends State<ListPage> {
|
|||
// This handles the case if there are no more elements in the list left which can be provided by the api
|
||||
if (VikunjaGlobal.of(context).taskService.maxPages ==
|
||||
_currentPage &&
|
||||
index == _tasks.length - 1) return null;
|
||||
index == taskState.tasks.length - 1) return null;
|
||||
|
||||
if (index >= _tasks.length &&
|
||||
if (index >= taskState.tasks.length &&
|
||||
_currentPage <
|
||||
VikunjaGlobal.of(context)
|
||||
.taskService
|
||||
|
@ -75,9 +72,9 @@ class _ListPageState extends State<ListPage> {
|
|||
_currentPage++;
|
||||
_loadTasksForPage(_currentPage);
|
||||
}
|
||||
return index < _tasks.length
|
||||
return index < taskState.tasks.length
|
||||
? TaskTile(
|
||||
task: _tasks[index],
|
||||
task: taskState.tasks[index],
|
||||
)
|
||||
: null;
|
||||
})
|
||||
|
||||
|
@ -92,29 +89,15 @@ class _ListPageState extends State<ListPage> {
|
|||
}
|
||||
|
||||
Future<void> _loadList() {
|
||||
return VikunjaGlobal.of(context)
|
||||
.listService
|
||||
.get(widget.taskList.id)
|
||||
.then((list) {
|
||||
setState(() {
|
||||
_loading = true;
|
||||
_list = list;
|
||||
});
|
||||
_loadTasksForPage(_currentPage);
|
||||
});
|
||||
_loadTasksForPage(1);
|
||||
}
|
||||
|
||||
Future<void> _loadTasksForPage(int page) {
|
||||
return VikunjaGlobal.of(context).taskService.getAll(_list.id, {
|
||||
"sort_by": ["done", "id"],
|
||||
"order_by": ["asc", "desc"],
|
||||
"page": [page.toString()]
|
||||
}).then((tasks) {
|
||||
setState(() {
|
||||
_loading = false;
|
||||
_tasks.addAll(tasks);
|
||||
});
|
||||
});
|
||||
void _loadTasksForPage(int page) {
|
||||
Provider.of<ListProvider>(context, listen: false).loadTasks(
|
||||
context: context,
|
||||
listId: _list.id,
|
||||
page: page,
|
||||
);
|
||||
}
|
||||
|
||||
_addItemDialog(BuildContext context) {
|
||||
|
@ -127,6 +110,7 @@ class _ListPageState extends State<ListPage> {
|
|||
}
|
||||
|
||||
_addItem(String name, BuildContext context) {
|
||||
// FIXME: Use provider
|
||||
konrad marked this conversation as resolved
Outdated
JonasFranz
commented
resolve provider resolve provider
konrad
commented
Done. Done.
|
||||
var globalState = VikunjaGlobal.of(context);
|
||||
var newTask = Task(
|
||||
id: null, title: name, owner: globalState.currentUser, done: false);
|
||||
|
|
|
@ -3,12 +3,14 @@ import 'dart:async';
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:after_layout/after_layout.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import 'package:vikunja_app/components/AddDialog.dart';
|
||||
import 'package:vikunja_app/global.dart';
|
||||
import 'package:vikunja_app/models/list.dart';
|
||||
import 'package:vikunja_app/models/namespace.dart';
|
||||
import 'package:vikunja_app/pages/list/list.dart';
|
||||
import 'package:vikunja_app/stores/list_store.dart';
|
||||
|
||||
class NamespacePage extends StatefulWidget {
|
||||
final Namespace namespace;
|
||||
|
@ -100,8 +102,14 @@ class _NamespacePageState extends State<NamespacePage>
|
|||
}
|
||||
|
||||
_openList(BuildContext context, TaskList list) {
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(builder: (context) => ListPage(taskList: list)));
|
||||
Navigator.of(context).push(MaterialPageRoute(
|
||||
builder: (context) => ChangeNotifierProvider<ListProvider>(
|
||||
create: (_) => new ListProvider(),
|
||||
child: ListPage(
|
||||
taskList: list,
|
||||
),
|
||||
),
|
||||
JonasFranz
commented
Maybe init the provider in the ListPage? Make sure to use Builder as child when doing it. Maybe init the provider in the ListPage? Make sure to use Builder as child when doing it.
konrad
commented
You mean in the You mean in the `build` method of it?
|
||||
));
|
||||
}
|
||||
|
||||
_addListDialog(BuildContext context) {
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:vikunja_app/models/task.dart';
|
||||
import 'package:vikunja_app/global.dart';
|
||||
|
||||
class ListProvider with ChangeNotifier {
|
||||
bool _isLoading = false;
|
||||
// TODO: Streams
|
||||
List<Task> _tasks = [];
|
||||
|
||||
bool get isLoading => _isLoading;
|
||||
|
||||
set tasks(List<Task> tasks) {
|
||||
_tasks = tasks;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
List<Task> get tasks => _tasks;
|
||||
|
||||
void loadTasks({BuildContext context, int listId, int page = 1}) {
|
||||
_isLoading = true;
|
||||
notifyListeners();
|
||||
|
||||
VikunjaGlobal.of(context).taskService.getAll(listId, {
|
||||
"sort_by": ["done", "id"],
|
||||
"order_by": ["asc", "desc"],
|
||||
"page": [page.toString()]
|
||||
}).then((tasks) {
|
||||
_tasks.addAll(tasks);
|
||||
_isLoading = false;
|
||||
notifyListeners();
|
||||
});
|
||||
}
|
||||
}
|
15
pubspec.lock
15
pubspec.lock
|
@ -139,6 +139,13 @@ packages:
|
|||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.8"
|
||||
nested:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: nested
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.0.4"
|
||||
path:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -160,6 +167,13 @@ packages:
|
|||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.4.0"
|
||||
provider:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: provider
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "4.0.5+1"
|
||||
quiver:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -244,3 +258,4 @@ packages:
|
|||
version: "2.2.0"
|
||||
sdks:
|
||||
dart: ">=2.4.0 <3.0.0"
|
||||
flutter: ">=1.12.1"
|
||||
|
|
|
@ -13,6 +13,7 @@ dependencies:
|
|||
flutter_secure_storage: 3.3.1+1
|
||||
http: 0.12.0+3
|
||||
after_layout: ^1.0.7
|
||||
provider: ^4.0.5
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
|
|
Reference in New Issue
Please create a custom widget which handles auto loading new tasks and inserting dividers.