From b18ae877138e9dfbffb6fd78a9323544030db709 Mon Sep 17 00:00:00 2001 From: Yash Agrawal Date: Fri, 11 Feb 2022 17:03:30 +0530 Subject: [PATCH 1/2] task completed by Yash Agrawal --- lib/main.dart | 21 +----- lib/models/todo_list.dart | 6 +- lib/screen/todo_screen.dart | 117 ++++++++++++++++++++++++++++- lib/widgets/add_todo_dialogue.dart | 18 ++++- lib/widgets/todo_list_item.dart | 1 - pubspec.lock | 20 ++--- 6 files changed, 142 insertions(+), 41 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 30aa948..42371f4 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,23 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:workshop_task/screen/todo_screen.dart'; void main() { - runApp(const MyApp()); -} - -class MyApp extends StatelessWidget { - const MyApp({Key key}) : super(key: key); - - // This widget is the root of your application. - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Flutter Demo', - theme: ThemeData( - // is not restarted. - primarySwatch: Colors.blue, - ), - //GO to correct screen. - home: Container(), - ); - } + runApp(const MaterialApp(home: TodoScreen())); } diff --git a/lib/models/todo_list.dart b/lib/models/todo_list.dart index c7c3b03..12503f9 100644 --- a/lib/models/todo_list.dart +++ b/lib/models/todo_list.dart @@ -4,14 +4,14 @@ class TodoList { final List _allTodos = []; List allTodos() { - //TODO:Add logic to complete + return _allTodos; } void addTodo(Todo todo) { - //TODO:Add logic to add a todo + _allTodos.add(todo); } void deleteTodo(Todo todo) { - //TODO:Add logic to delete todo + _allTodos.remove(todo); } } diff --git a/lib/screen/todo_screen.dart b/lib/screen/todo_screen.dart index 70caa8b..8f25cc7 100644 --- a/lib/screen/todo_screen.dart +++ b/lib/screen/todo_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:workshop_task/models/todo_list.dart'; +import 'package:workshop_task/models/todo.dart'; class TodoScreen extends StatefulWidget { const TodoScreen({Key key}) : super(key: key); @@ -11,16 +12,124 @@ class TodoScreen extends StatefulWidget { class _TodoScreenState extends State { TodoList todoList = TodoList(); + final TextEditingController myController1 = TextEditingController(); + final TextEditingController myController2 = TextEditingController(); + + Widget widgetbody = Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: const [ + Center( + child: Text("No Todos Added"), + ) + ], + ); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text("Your Todos"), ), - //TODO: Add todo button with this icon => "+". - floatingActionButton: const FloatingActionButton(), - body: //TODO: Add list view displaying all todo. - Container(), + floatingActionButton: FloatingActionButton( + child: const Icon(Icons.add), + onPressed: () { + showDialog( + context: context, + builder: (BuildContext context) { + return Dialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0)), + child: SizedBox( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + TextField( + controller: myController1, + decoration: + const InputDecoration(labelText: "Title"), + ), + TextField( + controller: myController2, + decoration: const InputDecoration( + labelText: "Description"), + ), + const SizedBox(height: 18), + SizedBox( + child: TextButton( + child: const Text("Submit"), + onPressed: () { + if (myController1.text.isNotEmpty && + myController2.text.isNotEmpty) { + setState(() { + String title = myController1.text; + String description = myController2.text; + + Todo newTodo = Todo( + title: title, + description: description); + + todoList.addTodo(newTodo); + + myController1.clear(); + myController2.clear(); + + Navigator.of(context).pop(); + }); + } + }, + )) + ], + )))); + }); + }, + ), + body: todoList.allTodos().isNotEmpty + ? ListView.builder( + padding: const EdgeInsets.all(8.0), + itemCount: todoList.allTodos().length, + itemBuilder: (BuildContext context, int index) { + return GestureDetector( + onDoubleTap: () { + showDialog( + context: context, + builder: (BuildContext contextofdeletion) { + return AlertDialog( + content: const Text( + "Are you sure you want to delete this Todo?"), + actions: [ + TextButton( + child: const Text("Yes"), + onPressed: () { + setState(() { + todoList.deleteTodo( + todoList.allTodos()[index]); + Navigator.of(contextofdeletion).pop(); + }); + }), + TextButton( + child: const Text("No"), + onPressed: () { + Navigator.of(contextofdeletion).pop(); + }) + ], + ); + }); + }, + child: ListTile( + title: Text(todoList.allTodos()[index].title, + style: const TextStyle(fontSize: 20.0)), + subtitle: Text(todoList.allTodos()[index].description), + leading: CircleAvatar( + child: Text("${index + 1}"), + backgroundColor: Colors.black, + ), + )); + }) + : const Center(child: Text("No Todo's added")), ); } } diff --git a/lib/widgets/add_todo_dialogue.dart b/lib/widgets/add_todo_dialogue.dart index 29ccd08..69d879f 100644 --- a/lib/widgets/add_todo_dialogue.dart +++ b/lib/widgets/add_todo_dialogue.dart @@ -8,6 +8,8 @@ class AddTodoDialogue extends StatefulWidget { } class _AddTodoDialogueState extends State { + final TextEditingController myController = TextEditingController(); + final TextEditingController myController2 = TextEditingController(); @override Widget build(BuildContext context) { return Container( @@ -16,10 +18,18 @@ class _AddTodoDialogueState extends State { child: Column( mainAxisSize: MainAxisSize.min, children: [ - //TODO: Take input of title. and description. - TextField(), - TextField(), - TextButton(), + TextField( + decoration: const InputDecoration(hintText: "Title"), + controller: myController, + ), + TextField( + decoration: const InputDecoration(hintText: "Description"), + controller: myController2, + ), + TextButton( + onPressed: () {}, + child: const Text('Submit'), + ), ], ), ); diff --git a/lib/widgets/todo_list_item.dart b/lib/widgets/todo_list_item.dart index fe8536f..69de7dc 100644 --- a/lib/widgets/todo_list_item.dart +++ b/lib/widgets/todo_list_item.dart @@ -8,7 +8,6 @@ class TodoListItem extends StatelessWidget { @override Widget build(BuildContext context) { - //TODO: display title and description of todo. return Container(); } } diff --git a/pubspec.lock b/pubspec.lock index 8b519cf..7250f41 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -193,6 +193,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.12.11" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.3" meta: dependency: transitive description: @@ -228,13 +235,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.0" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" pool: dependency: transitive description: @@ -337,21 +337,21 @@ packages: name: test url: "https://pub.dartlang.org" source: hosted - version: "1.17.12" + version: "1.19.5" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.3" + version: "0.4.8" test_core: dependency: transitive description: name: test_core url: "https://pub.dartlang.org" source: hosted - version: "0.4.2" + version: "0.4.9" typed_data: dependency: transitive description: From 7eac6f70fbc55de776e0e131b947721e54132f0b Mon Sep 17 00:00:00 2001 From: Yash Agrawal Date: Sat, 12 Feb 2022 20:13:31 +0530 Subject: [PATCH 2/2] done all the required changes --- lib/models/todo_list.dart | 2 +- lib/screen/todo_screen.dart | 85 +++++------------------ lib/widgets/add_todo_dialogue.dart | 108 +++++++++++++++++++++++------ lib/widgets/todo_list_item.dart | 9 ++- test/todo_screen_test.dart | 4 ++ 5 files changed, 118 insertions(+), 90 deletions(-) diff --git a/lib/models/todo_list.dart b/lib/models/todo_list.dart index 12503f9..11a5652 100644 --- a/lib/models/todo_list.dart +++ b/lib/models/todo_list.dart @@ -1,7 +1,7 @@ import 'package:workshop_task/models/todo.dart'; class TodoList { - final List _allTodos = []; + final List _allTodos = []; List allTodos() { return _allTodos; diff --git a/lib/screen/todo_screen.dart b/lib/screen/todo_screen.dart index 8f25cc7..848df18 100644 --- a/lib/screen/todo_screen.dart +++ b/lib/screen/todo_screen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:workshop_task/models/todo_list.dart'; -import 'package:workshop_task/models/todo.dart'; +import 'package:workshop_task/widgets/add_todo_dialogue.dart'; +import 'package:workshop_task/widgets/todo_list_item.dart'; class TodoScreen extends StatefulWidget { const TodoScreen({Key key}) : super(key: key); @@ -12,8 +13,8 @@ class TodoScreen extends StatefulWidget { class _TodoScreenState extends State { TodoList todoList = TodoList(); - final TextEditingController myController1 = TextEditingController(); - final TextEditingController myController2 = TextEditingController(); + // final TextEditingController myController1 = TextEditingController(); + // final TextEditingController myController2 = TextEditingController(); Widget widgetbody = Row( mainAxisAlignment: MainAxisAlignment.center, @@ -35,56 +36,13 @@ class _TodoScreenState extends State { onPressed: () { showDialog( context: context, - builder: (BuildContext context) { - return Dialog( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12.0)), - child: SizedBox( - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - TextField( - controller: myController1, - decoration: - const InputDecoration(labelText: "Title"), - ), - TextField( - controller: myController2, - decoration: const InputDecoration( - labelText: "Description"), - ), - const SizedBox(height: 18), - SizedBox( - child: TextButton( - child: const Text("Submit"), - onPressed: () { - if (myController1.text.isNotEmpty && - myController2.text.isNotEmpty) { - setState(() { - String title = myController1.text; - String description = myController2.text; - - Todo newTodo = Todo( - title: title, - description: description); - - todoList.addTodo(newTodo); - - myController1.clear(); - myController2.clear(); - - Navigator.of(context).pop(); - }); - } - }, - )) - ], - )))); - }); + builder: (BuildContext contextadd) { + return const AddTodoDialogue(); + }).then((value) { + setState(() { + todoList.addTodo(value); + }); + }); }, ), body: todoList.allTodos().isNotEmpty @@ -102,34 +60,29 @@ class _TodoScreenState extends State { "Are you sure you want to delete this Todo?"), actions: [ TextButton( - child: const Text("Yes"), onPressed: () { setState(() { todoList.deleteTodo( todoList.allTodos()[index]); Navigator.of(contextofdeletion).pop(); }); - }), + }, + child: const Text("Yes")), TextButton( - child: const Text("No"), onPressed: () { Navigator.of(contextofdeletion).pop(); - }) + }, + child: const Text("No")) ], ); }); }, - child: ListTile( - title: Text(todoList.allTodos()[index].title, - style: const TextStyle(fontSize: 20.0)), - subtitle: Text(todoList.allTodos()[index].description), - leading: CircleAvatar( - child: Text("${index + 1}"), - backgroundColor: Colors.black, - ), + child: TodoListItem( + index: index, + todo: todoList.allTodos()[index], )); }) - : const Center(child: Text("No Todo's added")), + : widgetbody, ); } } diff --git a/lib/widgets/add_todo_dialogue.dart b/lib/widgets/add_todo_dialogue.dart index 69d879f..ff95ec6 100644 --- a/lib/widgets/add_todo_dialogue.dart +++ b/lib/widgets/add_todo_dialogue.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:workshop_task/models/todo.dart'; class AddTodoDialogue extends StatefulWidget { const AddTodoDialogue({Key key}) : super(key: key); @@ -8,30 +9,93 @@ class AddTodoDialogue extends StatefulWidget { } class _AddTodoDialogueState extends State { - final TextEditingController myController = TextEditingController(); + final TextEditingController myController1 = TextEditingController(); final TextEditingController myController2 = TextEditingController(); + @override Widget build(BuildContext context) { - return Container( - width: 200, - padding: const EdgeInsets.all(16), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - TextField( - decoration: const InputDecoration(hintText: "Title"), - controller: myController, - ), - TextField( - decoration: const InputDecoration(hintText: "Description"), - controller: myController2, - ), - TextButton( - onPressed: () {}, - child: const Text('Submit'), - ), - ], - ), - ); + return Dialog( + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)), + child: SizedBox( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + TextField( + controller: myController1, + decoration: const InputDecoration(labelText: "Title"), + ), + TextField( + controller: myController2, + decoration: + const InputDecoration(labelText: "Description"), + ), + TextButton( + onPressed: () { + setState(() { + if (myController1.text.isNotEmpty && + myController2.text.isNotEmpty) { + setState(() { + String title = myController1.text; + String description = myController2.text; + + Todo newincomingTodo = + Todo(title: title, description: description); + + myController1.clear(); + myController2.clear(); + + Navigator.pop(context, newincomingTodo); + }); + } + }); + }, + child: const Text("Submit"), + ) + ], + ))) + // width: 200, + // padding: const EdgeInsets.all(16), + // child: Column( + // mainAxisSize: MainAxisSize.min, + // children: [ + // TextField( + // controller: myController1, + // decoration: const InputDecoration(labelText: "Title"), + // ), + // TextField( + // controller: myController2, + // decoration: const InputDecoration(labelText: "Description"), + // ), + // const SizedBox(height: 18), + // SizedBox( + // child: TextButton( + // child: const Text("Submit"), + // onPressed: () { + // if (myController1.text.isNotEmpty && + // myController2.text.isNotEmpty) { + // setState(() { + // String title = myController1.text; + // String description = myController2.text; + + // Todo newTodo = Todo(title: title, description: description); + + // todoList.addTodo(newTodo); + + // myController1.clear(); + // myController2.clear(); + + // Navigator.of(context).pop(); + // }); + // } + // }, + // )) + // ], + // ), + ); } } diff --git a/lib/widgets/todo_list_item.dart b/lib/widgets/todo_list_item.dart index 69de7dc..1d00fe2 100644 --- a/lib/widgets/todo_list_item.dart +++ b/lib/widgets/todo_list_item.dart @@ -8,6 +8,13 @@ class TodoListItem extends StatelessWidget { @override Widget build(BuildContext context) { - return Container(); + return ListTile( + title: Text(todo.title, style: const TextStyle(fontSize: 20.0)), + subtitle: Text(todo.description), + leading: CircleAvatar( + child: Text("${index + 1}"), + backgroundColor: Colors.black, + ), + ); } } diff --git a/test/todo_screen_test.dart b/test/todo_screen_test.dart index 6a22f81..4673720 100644 --- a/test/todo_screen_test.dart +++ b/test/todo_screen_test.dart @@ -2,6 +2,8 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:workshop_task/screen/todo_screen.dart'; +import 'package:workshop_task/widgets/add_todo_dialogue.dart'; +import 'package:workshop_task/widgets/todo_list_item.dart'; Widget createHomeScreen() => const MaterialApp( home: TodoScreen(), @@ -33,6 +35,7 @@ void main() { await tester.pumpAndSettle(); await tester.tap(find.byIcon(Icons.add).first); await tester.pumpAndSettle(); + expect(tester.widgetList(find.byType(AddTodoDialogue)).length, 1); expect(tester.widgetList(find.byType(Dialog)).length, 1); var textfields = tester.widgetList(find.byType(TextField)); expect(textfields.length, 2); @@ -54,6 +57,7 @@ void main() { expect(tester.widgetList(find.textContaining('d')).isNotEmpty, true); expect(tester.widgetList(find.byType(ListView)).isNotEmpty, true); + expect(tester.widgetList(find.byType(TodoListItem)).isNotEmpty, true); await tester.tap(find.textContaining('t')); await tester.pump(kDoubleTapMinTime); // <- Add this