Skip to content

Commit f782ee9

Browse files
committed
home - task and type added
now can add task and type from home
1 parent 04261fc commit f782ee9

File tree

6 files changed

+239
-41
lines changed

6 files changed

+239
-41
lines changed

lib/data/storage.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,16 @@ class StoreData {
3939
String prevJsonData = await getData();
4040
Map<String,dynamic> data = jsonDecode(prevJsonData);
4141
data["types"].add(newType.toLowerCase());
42+
data["tasks"].addAll({newType.toLowerCase():{}});
4243
return dataFile.writeAsString(jsonEncode(data));
4344
}
4445

45-
Future<File> addTask(Map<String,dynamic> newJsonData) async {
46+
Future<File> addTask(String type,Map<String,dynamic> newJsonData) async {
4647
File dataFile = await getFile();
4748
print("Storing in existing file");
4849
String prevJsonData = await getData();
4950
Map<String,dynamic> data = jsonDecode(prevJsonData);
50-
data["tasks"].addAll(newJsonData);
51+
data["tasks"][type].addAll(newJsonData);
5152
return dataFile.writeAsString(jsonEncode(data));
5253
}
5354

lib/providers/home.dart

Lines changed: 47 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class HomeProvider extends ChangeNotifier {
1515
bool _isNewUser;
1616
String _userName;
1717
List<String> _types = [];
18-
List<TasksProvider> _taskProviders = [];
18+
Map<String,TasksProvider> _taskProviders = {};
1919

2020
bool get isNewUser {
2121
return _isNewUser!=null;
@@ -30,11 +30,53 @@ class HomeProvider extends ChangeNotifier {
3030
}
3131

3232
List<TasksProvider> get getTaskProviders {
33-
return [..._taskProviders];
33+
List<TasksProvider> tempList = [];
34+
_taskProviders.forEach((type,taskProvider){
35+
tempList.add(taskProvider);
36+
});
37+
return tempList;
3438
}
3539

36-
Future<bool> addTask() async {
40+
Future<bool> addTaskFromHome(String type,String taskName) async {
41+
Task newTask = new Task(
42+
id: DateTime.now().toString(),
43+
name: taskName,
44+
type: type,
45+
isDone: false
46+
);
47+
TasksProvider tasksProvider = _taskProviders[type];
48+
try {
49+
bool success = await tasksProvider.addTask(newTask);
50+
if(success){
51+
print("Task added from home");
52+
return true;
53+
}else{
54+
return false;
55+
}
56+
}catch(e){
57+
print("Task adding failed");
58+
print(e);
59+
return false;
60+
}
61+
}
3762

63+
Future<bool> addType(String type) async{
64+
try {
65+
File newFile = await storage.addType(type.toLowerCase());
66+
if(newFile!=null){
67+
print("$type Type added");
68+
_types.add(type.toLowerCase());
69+
TasksProvider _newTasksProvider = TasksProvider(type,{});
70+
_taskProviders.addAll({type:_newTasksProvider});
71+
notifyListeners();
72+
return true;
73+
}
74+
}catch(e){
75+
print("Type adding failed");
76+
print(e);
77+
return false;
78+
}
79+
return false;
3880
}
3981

4082

@@ -52,12 +94,12 @@ class HomeProvider extends ChangeNotifier {
5294
tempTypes.add(type.toString());
5395
});
5496
_types = tempTypes;
55-
List<TasksProvider> tempList = [];
97+
Map<String,TasksProvider> tempList = {};
5698
_types.forEach((type){
5799
print("type:$type");
58100
Map<String,dynamic> _eachType = data['tasks'][type];
59101
TasksProvider _newTasksProvider = TasksProvider(type,_eachType);
60-
tempList.add(_newTasksProvider);
102+
tempList.addAll({type:_newTasksProvider});
61103
});
62104
_taskProviders = tempList;
63105
}
@@ -69,22 +111,6 @@ class HomeProvider extends ChangeNotifier {
69111
}
70112
}
71113

72-
Future<bool> addType(String type) async{
73-
try {
74-
File success = await storage.addType(type.toLowerCase());
75-
if(success!=null){
76-
print("$type Type added");
77-
_types.add(type.toLowerCase());
78-
notifyListeners();
79-
return true;
80-
}
81-
}catch(e){
82-
print("Type adding failed");
83-
print(e);
84-
return false;
85-
}
86-
return false;
87-
}
88114

89115
Future<bool> createNewUserData() async {
90116
Map<String,dynamic> newUserData = {

lib/providers/tasks.dart

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,20 +47,24 @@ class TasksProvider extends ChangeNotifier {
4747
return [..._tasks];
4848
}
4949

50-
Future<void> addTask(Task newTask) async {
50+
Future<bool> addTask(Task newTask) async {
5151
Map<String,dynamic> newJsonData = {
5252
newTask.id : newTask.toJson()
5353
};
5454
try {
55-
File success = await storage.addTask(newJsonData);
55+
File success = await storage.addTask(_type,newJsonData);
5656
if(success!=null){
57-
print("Task added");
5857
_tasks.add(newTask);
58+
print("Task added in individual provider");
59+
notifyListeners();
60+
return true;
5961
}
6062
}catch(e){
6163
print("Task adding failed");
6264
print(e);
65+
return false;
6366
}
67+
return false;
6468
}
6569

6670
Future<void> removeTask(String key) async {

lib/screens/todo_app.dart

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import '../providers/tasks.dart';
1414

1515
//widgets
1616
import '../widgets/new_type_dialog.dart';
17+
import '../widgets/new_all_task_dialog.dart';
1718

1819
class ToDo extends StatefulWidget {
1920
static const routeName = '/todo-screen';
@@ -58,19 +59,27 @@ class _ToDoState extends State<ToDo> {
5859
bottom: CustomAppBar(homeProvider.getUserName),
5960
),
6061
body: ListView.builder(
62+
padding: EdgeInsets.only(left: 20),
63+
scrollDirection: Axis.horizontal,
6164
itemCount: taskProviders.length,
6265
itemBuilder: (cyx,i){
63-
return ChangeNotifierProvider.value(
64-
value: taskProviders[i],
65-
child: Consumer<TasksProvider>(
66-
builder: (ctx,task,widget){
67-
return Column(
68-
children: <Widget>[
69-
TypesCard(height: height,width: width,),
70-
],
71-
);
72-
},
73-
),
66+
return Column(
67+
children: <Widget>[
68+
ChangeNotifierProvider.value(
69+
value: taskProviders[i],
70+
child: Consumer<TasksProvider>(
71+
builder: (ctx,task,widget){
72+
return TypesCard(
73+
height: height,
74+
width: width,
75+
type: task.getType,
76+
done: task.getTotalDone,
77+
total: task.getTotalTask,
78+
);
79+
},
80+
),
81+
)
82+
],
7483
);
7584
},
7685
)
@@ -122,7 +131,12 @@ class CustomAppBar extends StatelessWidget with PreferredSizeWidget {
122131
IconButton(
123132
icon: Icon(Icons.add_circle_outline,color: Colors.white,),
124133
onPressed: (){
125-
Navigator.of(context).pushNamed(AddTaskScreen.routeName);
134+
showDialog(
135+
context: context,
136+
builder: (context){
137+
return NewAllTaskDialog();
138+
}
139+
);
126140
},
127141
),
128142
],

lib/widgets/new_all_task_dialog.dart

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:provider/provider.dart';
3+
4+
//providers
5+
import '../providers/home.dart';
6+
7+
8+
class NewAllTaskDialog extends StatefulWidget {
9+
@override
10+
_NewAllTaskDialogState createState() => _NewAllTaskDialogState();
11+
}
12+
13+
class _NewAllTaskDialogState extends State<NewAllTaskDialog> {
14+
final _form = GlobalKey<FormState>();
15+
String _type = 'common';
16+
String _taskName;
17+
bool _isLoading = false;
18+
19+
Future<void> _onSubmit() async{
20+
final isValid = _form.currentState.validate();
21+
if (!isValid) {
22+
return;
23+
}
24+
_form.currentState.save();
25+
setState(() {
26+
_isLoading = true;
27+
});
28+
try{
29+
bool success = await Provider.of<HomeProvider>(context).addTaskFromHome(_type, _taskName);
30+
if(success){
31+
print("Add all task Dialog success, popping off");
32+
}
33+
}catch(e){
34+
print(e);
35+
}
36+
setState(() {
37+
_isLoading = false;
38+
});
39+
Navigator.of(context).pop();
40+
}
41+
42+
@override
43+
Widget build(BuildContext context) {
44+
List<String> _types = Provider.of<HomeProvider>(context).getTypes;
45+
List<DropdownMenuItem<String>> _items = [];
46+
_types.forEach((type){
47+
DropdownMenuItem<String> item = new DropdownMenuItem(
48+
value: type.toString(),
49+
child: Text("$type"),
50+
);
51+
_items.add(item);
52+
});
53+
return AlertDialog(
54+
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(3)),
55+
title: Text("Add new task"),
56+
content: Column(
57+
mainAxisSize: MainAxisSize.min,
58+
children: <Widget>[
59+
Form(
60+
key: _form,
61+
child: Column(
62+
mainAxisSize: MainAxisSize.min,
63+
children: <Widget>[
64+
TextFormField(
65+
decoration: InputDecoration(
66+
border: OutlineInputBorder()
67+
),
68+
autocorrect: true,
69+
validator: (value){
70+
if (value.isEmpty) {
71+
return 'Please provide a value.';
72+
}
73+
return null;
74+
},
75+
onFieldSubmitted: (value){
76+
setState(() {
77+
_taskName= value;
78+
});
79+
},
80+
),
81+
SizedBox(height: 20,),
82+
DropdownButtonFormField<String>(
83+
decoration: InputDecoration(
84+
border: OutlineInputBorder()
85+
),
86+
value: _type,
87+
items: _items,
88+
onChanged: (val){
89+
setState(() {
90+
_type = val;
91+
});
92+
},
93+
),
94+
],
95+
),
96+
)
97+
],
98+
),
99+
actions: <Widget>[
100+
FlatButton(
101+
child: Text("Cancel"),
102+
onPressed: (){
103+
Navigator.of(context).pop();
104+
},
105+
),
106+
RaisedButton(
107+
child: _isLoading ? CircularProgressIndicator() : Text("Add"),
108+
onPressed: (){
109+
_onSubmit();
110+
},
111+
),
112+
],
113+
);
114+
}
115+
}

lib/widgets/types_card.dart

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,22 @@
11
import 'package:flutter/material.dart';
2+
3+
24
class TypesCard extends StatefulWidget {
35
final double height;
46
final double width;
7+
final String type;
8+
final int done;
9+
final int total;
510

6-
TypesCard({
11+
const TypesCard({
12+
Key key,
713
this.height,
8-
this.width
9-
});
14+
this.width,
15+
this.type,
16+
this.done,
17+
this.total
18+
}) : super(key: key);
19+
1020

1121
@override
1222
_TypesCardState createState() => _TypesCardState();
@@ -15,7 +25,9 @@ class TypesCard extends StatefulWidget {
1525
class _TypesCardState extends State<TypesCard> {
1626
@override
1727
Widget build(BuildContext context) {
28+
//final taskProvider = Provider.of<TasksProvider>(context);
1829
return Container(
30+
padding: EdgeInsets.fromLTRB(20, 20, 20, 40),
1931
margin: const EdgeInsets.symmetric(horizontal: 10,vertical: 15),
2032
height: widget.width*0.75*1.2,
2133
width: widget.width*0.75,
@@ -31,6 +43,32 @@ class _TypesCardState extends State<TypesCard> {
3143
)
3244
]
3345
),
46+
child: Column(
47+
mainAxisAlignment: MainAxisAlignment.spaceBetween,
48+
children: <Widget>[
49+
Row(
50+
mainAxisAlignment: MainAxisAlignment.spaceBetween,
51+
children: <Widget>[
52+
Text("${widget.type}".toUpperCase(),style: TextStyle(fontSize: 25,color: Colors.black),),
53+
IconButton(
54+
icon: Icon(Icons.delete),
55+
onPressed: (){},
56+
)
57+
],
58+
),
59+
Column(
60+
crossAxisAlignment: CrossAxisAlignment.start,
61+
children: <Widget>[
62+
Text("You have ${widget.total - widget.done} tasks.",style: TextStyle(fontSize: 17),),
63+
SizedBox(height: 20,),
64+
LinearProgressIndicator(
65+
value: 0.3,
66+
)
67+
],
68+
)
69+
//Text("${widget.total}"),
70+
],
71+
),
3472
);
3573
}
3674
}

0 commit comments

Comments
 (0)