Skip to content

Commit 1aa58d8

Browse files
committed
tasks detail screen working fine
the issue of provider is resolved
1 parent 715ae10 commit 1aa58d8

File tree

8 files changed

+237
-114
lines changed

8 files changed

+237
-114
lines changed

lib/data/storage.dart

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,20 +62,19 @@ class StoreData {
6262
return dataFile.writeAsString(jsonEncode(data));
6363
}
6464

65-
Future<File> updateTask(String key,Map<String,dynamic> newJsonData) async {
65+
Future<File> updateTask(String type,String key,Map<String,dynamic> newJsonData) async {
6666
File dataFile = await getFile();
6767
String prevJsonData = await getData();
6868
Map<String,dynamic> data = jsonDecode(prevJsonData);
69-
data.update(key,(dynamic value){return newJsonData[key];},ifAbsent: (){return newJsonData[key];});
70-
//data[key] = newJsonData[key];
69+
data['tasks'][type].update(key,(dynamic value){return newJsonData[key];},ifAbsent: (){return newJsonData[key];});
7170
return dataFile.writeAsString(jsonEncode(data));
7271
}
7372

74-
Future<File> deleteTask(String key) async{
73+
Future<File> deleteTask(String type,String id) async{
7574
File dataFile = await getFile();
7675
String prevJsonData = await getData();
7776
Map<String,dynamic> data = jsonDecode(prevJsonData);
78-
data.remove(key);
77+
data['tasks'][type].remove(id);
7978
return dataFile.writeAsString(jsonEncode(data));
8079
}
8180
}

lib/main.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import './screens/new_user_screen.dart';
88
import './screens/loading_screen.dart';
99
import './screens/todo_app.dart';
1010
import './screens/add_task_screen.dart';
11+
import './screens/todos_screen.dart';
1112

1213
//providers
13-
import './providers/tasks.dart';
1414
import 'package:my_todo/providers/home.dart';
1515

1616
void main(){
@@ -47,7 +47,8 @@ class MyApp extends StatelessWidget {
4747
},
4848
),
4949
routes: {
50-
AddTaskScreen.routeName:(ctx)=>AddTaskScreen()
50+
AddTaskScreen.routeName:(ctx)=>AddTaskScreen(),
51+
ToDosScreen.routeName:(ctx)=>ToDosScreen()
5152
},
5253
);
5354
},

lib/models/task.dart

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
import 'dart:io';
21
import 'package:flutter/foundation.dart';
3-
import '../data/storage.dart';
42

53
class Task extends ChangeNotifier {
64
String id;
@@ -23,38 +21,4 @@ class Task extends ChangeNotifier {
2321
'isDone' : isDone,
2422
};
2523
}
26-
27-
Future<bool> updateTask() async {
28-
try{
29-
StoreData storage = new StoreData();
30-
Map<String,dynamic> newJsonData = {
31-
this.id : this.toJson()
32-
};
33-
File success = await storage.updateTask(this.id, newJsonData);
34-
if(success!=null){
35-
return true;
36-
}
37-
}catch(e){
38-
print(e);
39-
return false;
40-
}
41-
return true;
42-
}
43-
44-
Future<void> toggleDone() async {
45-
bool isDonePrev = isDone;
46-
isDone = !isDone;
47-
try{
48-
bool updateSuccess = await updateTask();
49-
if(updateSuccess){
50-
print("Task done updated");
51-
}else{
52-
throw updateSuccess;
53-
}
54-
}catch(e){
55-
isDone = isDonePrev;
56-
print("${this.id} Task done update failed");
57-
}
58-
notifyListeners();
59-
}
6024
}

lib/providers/tasks.dart

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,21 @@ import '../data/storage.dart' ;
77
class TasksProvider extends ChangeNotifier {
88
StoreData storage = new StoreData();
99
String _type;
10-
int _done = 0;
1110
List<Task> _tasks = [];
1211

1312
TasksProvider(String type,Map<String,dynamic> tasks){
1413
_type = type;
1514
Task tempTask;
1615
List<Task> tempList = [];
17-
int _tempDone = 0;
1816
tasks.forEach((key,data){
1917
tempTask = new Task(
2018
id: data['id'].toString(),
2119
name: data['name'].toString(),
2220
type: data['type'].toString(),
2321
isDone: data['isDone']
2422
);
25-
if(tempTask.isDone){
26-
_tempDone +=1;
27-
}
2823
tempList.add(tempTask);
2924
});
30-
_done = _tempDone;
3125
_tasks = tempList;
3226
}
3327

@@ -36,7 +30,13 @@ class TasksProvider extends ChangeNotifier {
3630
}
3731

3832
int get getTotalDone {
39-
return _done;
33+
int _tempDone = 0;
34+
_tasks.forEach((task){
35+
if(task.isDone){
36+
_tempDone +=1;
37+
}
38+
});
39+
return _tempDone;
4040
}
4141

4242
int get getTotalTask {
@@ -67,14 +67,50 @@ class TasksProvider extends ChangeNotifier {
6767
return false;
6868
}
6969

70-
Future<void> removeTask(String key) async {
70+
Future<void> removeTask(String id) async {
7171
try{
72-
await storage.deleteTask(key);
73-
print("task deleted");
74-
_tasks.removeWhere((task)=>task.id==key);
72+
await storage.deleteTask(_type,id);
73+
//print("task deleted");
74+
_tasks.removeWhere((task)=>task.id==id);
7575
notifyListeners();
7676
}catch(e){
7777
print(e);
7878
}
7979
}
80+
81+
Future<bool> updateTask(Task task) async {
82+
try{
83+
StoreData storage = new StoreData();
84+
Map<String,dynamic> newJsonData = {
85+
task.id : task.toJson()
86+
};
87+
File success = await storage.updateTask(_type,task.id,newJsonData);
88+
if(success!=null){
89+
return true;
90+
}
91+
}catch(e){
92+
print(e);
93+
return false;
94+
}
95+
return true;
96+
}
97+
98+
Future<void> toggleDone(String id) async {
99+
int index = _tasks.indexWhere((task)=>task.id==id);
100+
try{
101+
Task tempTask = _tasks[index];
102+
tempTask.isDone = !tempTask.isDone;
103+
bool updateSuccess = await updateTask(tempTask);
104+
if(updateSuccess){
105+
//_tasks[index].isDone = !_tasks[index].isDone;
106+
//print("$id Task done updated");
107+
notifyListeners();
108+
}else{
109+
throw updateSuccess;
110+
}
111+
}catch(e){
112+
print("$id Task done update failed");
113+
}
114+
notifyListeners();
115+
}
80116
}

lib/screens/new_user_screen.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@ import 'package:flutter/material.dart';
22
import 'package:provider/provider.dart';
33

44
//providers
5-
import '../providers/tasks.dart';
65
import 'package:my_todo/providers/home.dart';
76

87
//screen
9-
import './add_task_screen.dart';
10-
import './todo_app.dart';
118

129
class NewUserScreen extends StatefulWidget {
1310
@override

lib/screens/todo_app.dart

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@ import 'package:my_todo/widgets/types_card.dart';
33
import 'package:provider/provider.dart';
44
import 'package:google_fonts/google_fonts.dart';
55

6-
import '../providers/tasks.dart';
7-
import '../models/task.dart';
86
//screens
9-
import './add_task_screen.dart';
107
import './loading_screen.dart';
118

129
//providers
@@ -84,19 +81,20 @@ class _ToDoState extends State<ToDo> {
8481
itemCount: taskProviders.length,
8582
itemBuilder: (cyx,i){
8683
return SingleChildScrollView(
87-
child: Column(
84+
child: Column(
8885
children: <Widget>[
8986
ChangeNotifierProvider.value(
9087
value: taskProviders[i],
9188
child: Consumer<TasksProvider>(
92-
builder: (ctx,task,widget){
89+
builder: (ctx,tasks,widget){
9390
return TypesCard(
9491
height: height,
9592
width: width,
96-
type: task.getType,
97-
done: task.getTotalDone,
98-
total: task.getTotalTask,
93+
type: tasks.getType,
94+
done: tasks.getTotalDone,
95+
total: tasks.getTotalTask,
9996
deleteFunction : removeTypeCard,
97+
tasksProvider: taskProviders[i],
10098
);
10199
},
102100
),
@@ -176,6 +174,5 @@ class CustomAppBar extends StatelessWidget with PreferredSizeWidget {
176174
}
177175

178176
@override
179-
// TODO: implement preferredSize
180177
Size get preferredSize => size;
181178
}

lib/screens/todos_screen.dart

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:google_fonts/google_fonts.dart';
3+
import 'package:provider/provider.dart';
4+
5+
//providers
6+
import '../providers/tasks.dart';
7+
8+
9+
class ToDosScreen extends StatefulWidget {
10+
static const routeName = '/todos-screen';
11+
@override
12+
_ToDosScreenState createState() => _ToDosScreenState();
13+
}
14+
15+
class _ToDosScreenState extends State<ToDosScreen> {
16+
@override
17+
Widget build(BuildContext context) {
18+
TasksProvider tasksProvider = ModalRoute.of(context).settings.arguments as TasksProvider;
19+
return ChangeNotifierProvider.value(
20+
value: tasksProvider,
21+
child: Consumer<TasksProvider>(
22+
builder:(ctx,tasks,_){
23+
return Scaffold(
24+
appBar: AppBar(
25+
centerTitle: true,
26+
title: Text(tasksProvider.getType.toUpperCase(),style: GoogleFonts.poppins(textStyle: TextStyle(fontSize: 20,fontWeight: FontWeight.w500)),),
27+
bottom: CustomAppBar(
28+
done: tasks.getTotalDone,
29+
total: tasks.getTotalTask,
30+
),
31+
),
32+
body: ListView.builder(
33+
itemCount: tasks.getTotalTask,
34+
itemBuilder: (ctx,i){
35+
return ListTile(
36+
leading: Checkbox(
37+
value: tasks.getTasks[i].isDone,
38+
onChanged: (value){
39+
tasksProvider.toggleDone(tasks.getTasks[i].id);
40+
},
41+
),
42+
title: Text(tasks.getTasks[i].name,style: TextStyle(decoration: tasks.getTasks[i].isDone ? TextDecoration.lineThrough : null),),
43+
trailing: tasks.getTasks[i].isDone ? IconButton(
44+
icon: Icon(Icons.delete),
45+
onPressed: (){
46+
tasksProvider.removeTask(tasks.getTasks[i].id);
47+
},
48+
) : null,
49+
);
50+
},
51+
),
52+
);
53+
}
54+
)
55+
);
56+
}
57+
}
58+
59+
60+
class CustomAppBar extends StatelessWidget with PreferredSizeWidget {
61+
final int done;
62+
final int total;
63+
CustomAppBar({
64+
this.done,
65+
this.total,
66+
});
67+
final size = AppBar().preferredSize*1.5;
68+
final TextStyle style = GoogleFonts.poppins(textStyle: TextStyle(fontSize: 17,color: Colors.white));
69+
@override
70+
Widget build(BuildContext context) {
71+
int left = total-done;
72+
return Container(
73+
padding: EdgeInsets.only(left: 30,right: 20),
74+
height: size.height,
75+
width: AppBar().preferredSize.width,
76+
child:
77+
Column(
78+
mainAxisSize: MainAxisSize.min,
79+
mainAxisAlignment: MainAxisAlignment.start,
80+
crossAxisAlignment: CrossAxisAlignment.start,
81+
children: <Widget>[
82+
left==0? Text("All tasks done",style: style,): left==1?
83+
Text("You have $left task",style: style,): Text("You have $left tasks",style: style,) ,
84+
SizedBox(height: 20,),
85+
LinearProgressIndicator(
86+
//backgroundColor: Colors.white30,
87+
valueColor: AlwaysStoppedAnimation<Color>(Colors.white),
88+
value: total==0? 1 : done==0? 0 : (done/total).toDouble(),
89+
)
90+
],
91+
),
92+
);
93+
}
94+
95+
@override
96+
Size get preferredSize => size;
97+
}
98+
99+
100+
101+
102+
103+
104+
// ListTile(
105+
// leading: Checkbox(
106+
// value: tasks[i].isDone,
107+
// onChanged: (value){
108+
// tasks[i].toggleDone();
109+
// },
110+
// ),
111+
// title: Text(tasks[i].name,style: TextStyle(decoration: tasks[i].isDone ? TextDecoration.lineThrough : null),),
112+
// trailing: tasks[i].isDone ? IconButton(
113+
// icon: Icon(Icons.delete),
114+
// onPressed: (){},
115+
// ) : null,
116+
// );

0 commit comments

Comments
 (0)