Untitled
unknown
plain_text
2 years ago
5.1 kB
5
Indexable
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class ToDo {
String title;
String subtitle;
ToDo({required this.title, required this.subtitle});
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: ToDoListPage(),
);
}
}
class ToDoListPage extends StatefulWidget {
@override
_ToDoListPageState createState() => _ToDoListPageState();
}
class _ToDoListPageState extends State<ToDoListPage> {
List<ToDo> toDoList = [];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Todo List'),
),
body: ListView.builder(
itemCount: toDoList.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(toDoList[index].title),
subtitle: Text(toDoList[index].subtitle),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
icon: Icon(Icons.edit),
onPressed: () {
_editToDoItem(index);
},
),
IconButton(
icon: Icon(Icons.delete),
onPressed: () {
_deleteToDoItem(index);
},
),
],
),
);
},
),
floatingActionButton: FloatingActionButton(
onPressed: () async {
await _showAddToDoDialog();
},
child: Icon(Icons.add),
),
);
}
Future<void> _showAddToDoDialog() async {
String title = '';
String subtitle = '';
await showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Add ToDo'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
TextField(
decoration: InputDecoration(labelText: 'Title'),
onChanged: (value) => title = value,
),
TextField(
decoration: InputDecoration(labelText: 'Subtitle'),
onChanged: (value) => subtitle = value,
),
],
),
actions: [
TextButton(
onPressed: () {
Navigator.pop(context);
},
child: Text('Cancel'),
),
TextButton(
onPressed: () {
if (title.isNotEmpty && subtitle.isNotEmpty) {
setState(() {
toDoList.add(ToDo(title: title, subtitle: subtitle));
});
Navigator.pop(context);
} else {
// Show an error message or handle the case where
// either title or subtitle is null or empty.
// For now, just print an error message.
print('Title and subtitle cannot be empty.');
}
},
child: Text('Save'),
),
],
);
},
);
}
Future<void> _editToDoItem(int index) async {
String title = toDoList[index].title;
String subtitle = toDoList[index].subtitle;
await showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Edit ToDo'),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
TextField(
decoration: InputDecoration(labelText: 'Title'),
controller: TextEditingController(text: title),
onChanged: (value) => title = value,
),
TextField(
decoration: InputDecoration(labelText: 'Subtitle'),
controller: TextEditingController(text: subtitle),
onChanged: (value) => subtitle = value,
),
],
),
actions: [
TextButton(
onPressed: () {
Navigator.pop(context);
},
child: Text('Cancel'),
),
TextButton(
onPressed: () {
if (title.isNotEmpty && subtitle.isNotEmpty) {
setState(() {
toDoList[index] = ToDo(title: title, subtitle: subtitle);
});
Navigator.pop(context);
} else {
// Show an error message or handle the case where
// either title or subtitle is null or empty.
// For now, just print an error message.
print('Title and subtitle cannot be empty.');
}
},
child: Text('Save'),
),
],
);
},
);
}
void _deleteToDoItem(int index) {
setState(() {
toDoList.removeAt(index);
});
}
}Editor is loading...
Leave a Comment