Start using providers
continuous-integration/drone/pr Build is passing Details

This commit is contained in:
kolaente 2020-06-16 16:04:18 +02:00
parent bc8188f44c
commit 7bd340f45c
Signed by: konrad
GPG Key ID: F40E70337AB24C9B
5 changed files with 77 additions and 36 deletions

View File

@ -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
var globalState = VikunjaGlobal.of(context);
var newTask = Task(
id: null, title: name, owner: globalState.currentUser, done: false);

View File

@ -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,
),
),
));
}
_addListDialog(BuildContext context) {

View File

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

View File

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

View File

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