diff --git a/lib/helpers/db_helper.dart b/lib/helpers/db_helper.dart index b59f251..6112bae 100644 --- a/lib/helpers/db_helper.dart +++ b/lib/helpers/db_helper.dart @@ -18,55 +18,79 @@ class DBHelper { sql.Batch batch = db.batch(); //task_list table batch.execute( - 'CREATE TABLE task_list(id TEXT PRIMARY KEY,title TEXT NOT NULL)'); + 'CREATE TABLE IF NOT EXISTS task_list(id TEXT PRIMARY KEY,title TEXT NOT NULL)'); //task table batch.execute( - 'CREATE TABLE task(id TEXT PRIMARY KEY,title TEXT NOT NULL,isDone INTEGER NOT NULL,task_list_id TEXT,FOREIGN KEY (task_list_id) REFERENCES task_list(id) ON UPDATE CASCADE ON DELETE CASCADE)'); + 'CREATE TABLE IF NOT EXISTS task(id TEXT PRIMARY KEY,title TEXT NOT NULL,isDone INTEGER NOT NULL,task_list_id TEXT,FOREIGN KEY (task_list_id) REFERENCES task_list(id) ON UPDATE CASCADE ON DELETE CASCADE)'); List result = await batch.commit(); - result.forEach((element) { - print(element); - }); }, version: 1); } //Insert Data static Future insert(String table, Map data) async { - final db = await DBHelper.database(); - await db.insert(table, data, - conflictAlgorithm: sql.ConflictAlgorithm.replace); + try{ + final db = await DBHelper.database(); + await db.insert(table, data, + conflictAlgorithm: sql.ConflictAlgorithm.replace); + }on sql.DatabaseException catch(e){ + print(e.toString()); + } + try{}on sql.DatabaseException catch(e){ + print(e.toString()); + } } //Fetch Data for Task List static Future>> getData(String table) async { - final db = await DBHelper.database(); - return db.query(table); + List> resultSet=[]; + try{ + final db = await DBHelper.database(); + resultSet= await db.query(table); + }on sql.DatabaseException catch(e){ + print(e.toString()); + } + return resultSet; } //Fetch data for Task by their foreign key task_list_id static Future>> getTaskData( String table, List whereArgs) async { - final db = await DBHelper.database(); - return await db - .query(table, where: 'task_list_id=?', whereArgs: [whereArgs[0]]); + List> resultSet=[]; + try{ + final db = await DBHelper.database(); + resultSet= await db + .query(table, where: 'task_list_id=?', whereArgs: [whereArgs[0]]); + }on sql.DatabaseException catch(e){ + print(e.toString()); + } + return resultSet; } //Update //TODO:Get where and where args from the model static Future update(String table, Map data) async { final db = await DBHelper.database(); - await db.update(table, data, - where: 'id=?', - whereArgs: ['id'], - conflictAlgorithm: sql.ConflictAlgorithm.replace); + try{ + await db.update(table, data, + where: 'id=?', + whereArgs: ['id'], + conflictAlgorithm: sql.ConflictAlgorithm.replace); + }on sql.DatabaseException catch(e){ + print(e.toString()); + } } //Delete static Future delete(String table, Map data) async { final db = await DBHelper.database(); - int result = await db.delete( - table, - where: 'id=?', - whereArgs: [data['id']], - ); + try{ + await db.delete( + table, + where: 'id=?', + whereArgs: [data['id']], + ); + }on sql.DatabaseException catch(e){ + print(e.toString()); + } } } diff --git a/lib/models/task.dart b/lib/models/task.dart index 10fe8d8..21ed29b 100644 --- a/lib/models/task.dart +++ b/lib/models/task.dart @@ -3,15 +3,16 @@ import 'dart:core'; class Task { final String id; - final String? name; + final String name; final String taskListId; bool isDone; Task( - {required this.id, - this.name, - required this.taskListId, - this.isDone = false}); + { + required this.id, + required this.name, + required this.taskListId, + this.isDone = false}); void toggleDone() { isDone = !isDone; diff --git a/lib/models/task_data.dart b/lib/models/task_data.dart index c28714d..e9e889c 100644 --- a/lib/models/task_data.dart +++ b/lib/models/task_data.dart @@ -26,10 +26,10 @@ class TaskData extends ChangeNotifier { } //We update the whole row - void updateTask(Task task) { + void updateTask(Task task) async{ task.toggleDone(); notifyListeners(); - DBHelper.update('task', { + await DBHelper.update('task', { 'id': task.id.toString(), 'isDone': task.isDone == true ? 1 : 0, 'title': task.name.toString(), diff --git a/lib/models/task_home_data.dart b/lib/models/task_home_data.dart index 3614cb2..94af953 100644 --- a/lib/models/task_home_data.dart +++ b/lib/models/task_home_data.dart @@ -27,7 +27,6 @@ class TaskListHome extends ChangeNotifier { }); notifyListeners(); } - void deleteTask(TaskList task) async { taskList.remove(task); await DBHelper.delete('task_list', { diff --git a/lib/screens/home.dart b/lib/screens/home.dart index f5afd8a..5a8ba79 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:provider/provider.dart'; import 'package:u_do/models/task_home_data.dart'; import 'package:u_do/screens/preferences_screen.dart'; @@ -51,10 +52,6 @@ class Home extends StatelessWidget { //This widgets contains all the TaskList for users class TaskHome extends StatelessWidget { - final List myProducts = - List.generate(3, (index) => {"id": index, "name": "Product $index"}) - .toList(); - @override Widget build(BuildContext context) { double textSize = MediaQuery.of(context).size.width / 20; @@ -73,8 +70,8 @@ class TaskHome extends StatelessWidget { child: Center( child: Text("No task group. Add a task"), ), - builder: (context, tasklistItems, child) { - return tasklistItems.taskList.length == 0 + builder: (context, taskListItems, child) { + return taskListItems.taskList.length == 0 ? child! : GridView.builder( gridDelegate: @@ -83,56 +80,67 @@ class TaskHome extends StatelessWidget { childAspectRatio: 3 / 3, crossAxisSpacing: 20, mainAxisSpacing: 20), - itemCount: tasklistItems.taskLength, + itemCount: taskListItems.taskLength, itemBuilder: (BuildContext context, index) { - return GestureDetector( - //Delete a taskList on longPress - onLongPress: () { - Provider.of(context, + return Slidable( + key: Key(index.toString()), + actionPane: SlidableDrawerActionPane(), + actionExtentRatio: 0.25, + secondaryActions: [ + IconSlideAction( + caption: 'Delete', + color: Colors.red, + icon: Icons.delete, + onTap: () { + Provider.of(context, listen: false) - .deleteTask( - tasklistItems.taskList[index]); - }, - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => TasksScreen( - tasklistItems - .taskList[index].id!))); - }, - child: Card( - elevation: 5.0, - child: Column( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Icon( - Icons.alarm, - color: Theme.of(context).canvasColor, - size: 50.0, - ), - SizedBox( - height: 20.0, - ), - Padding( - padding: EdgeInsets.symmetric( - horizontal: 10.0), - child: Text( - tasklistItems - .taskList[index].title!, - style: TextStyle( - color: Theme.of(context) - .canvasColor, - fontSize: textSize > 10 - ? textSize - : 10, - fontWeight: FontWeight.w800), - textAlign: TextAlign.center, + .deleteTask( + taskListItems.taskList[index]); + }, + ), + ], + child: GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => TasksScreen( + taskListItems + .taskList[index].id!))); + }, + child: Card( + elevation: 5.0, + child: Column( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + Icon( + Icons.alarm, + color: Theme.of(context).canvasColor, + size: 50.0, + ), + SizedBox( + height: 20.0, + ), + Padding( + padding: EdgeInsets.symmetric( + horizontal: 10.0), + child: Text( + taskListItems + .taskList[index].title!, + style: TextStyle( + color: Theme.of(context) + .canvasColor, + fontSize: textSize > 10 + ? textSize + : 10, + fontWeight: FontWeight.w800), + textAlign: TextAlign.center, + ), ), - ), - ]), - color: Theme.of(context).accentColor, + ]), + color: Theme.of(context).accentColor, + ), ), ); }); diff --git a/lib/widgets/task_tile.dart b/lib/widgets/task_tile.dart index 5d80b41..fbd0f9d 100644 --- a/lib/widgets/task_tile.dart +++ b/lib/widgets/task_tile.dart @@ -3,29 +3,20 @@ import 'package:flutter/material.dart'; class TaskTile extends StatelessWidget { final bool? isChecked; final String? taskTitle; - final Function? checkboxCallback; - final Function? longPressCallback; TaskTile( {this.isChecked, this.taskTitle, - this.checkboxCallback, - this.longPressCallback}); - + }); +//Added new things @override Widget build(BuildContext context) { return ListTile( - onLongPress: longPressCallback as void Function()?, title: Text( taskTitle!, style: TextStyle( decoration: isChecked! ? TextDecoration.lineThrough : null), ), - trailing: Checkbox( - activeColor: Theme.of(context).primaryColor, - value: isChecked, - onChanged: checkboxCallback as void Function(bool?)?, - ), ); } } diff --git a/lib/widgets/tasks_list.dart b/lib/widgets/tasks_list.dart index 269ea34..e6cb270 100644 --- a/lib/widgets/tasks_list.dart +++ b/lib/widgets/tasks_list.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; +import 'package:u_do/screens/add_task_screen.dart'; import 'package:u_do/widgets/task_tile.dart'; import 'package:provider/provider.dart'; import 'package:u_do/models/task_data.dart'; @@ -31,15 +33,26 @@ class TasksList extends StatelessWidget { : ListView.builder( itemBuilder: (context, index) { final task = taskData.tasks[index]; - return TaskTile( - taskTitle: task.name, - isChecked: task.isDone, - checkboxCallback: (checkboxState) { - taskData.updateTask(task); - }, - longPressCallback: () { - taskData.deleteTask(task); - }, + return Slidable( + key: Key(index.toString()), + actionPane: SlidableDrawerActionPane(), + actionExtentRatio: 0.25, + secondaryActions: [ + IconSlideAction( + caption: 'Delete', + color: Colors.red, + icon: Icons.delete, + onTap: () { + Provider.of(context, + listen: false) + .deleteTask(task); + }, + ), + ], + child: TaskTile( + taskTitle: task.name, + isChecked: task.isDone, + ), ); }, itemCount: taskData.taskCount, diff --git a/pubspec.yaml b/pubspec.yaml index 29d22c6..e37e2e5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: provider: ^5.0.0 sqflite: ^2.0.0+3 path: ^1.8.0 + flutter_slidable: ^0.6.0 dev_dependencies: flutter_test: