multi_select.dart 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // Multi Select widget
  2. // This widget is reusable
  3. import 'package:flutter/cupertino.dart';
  4. import 'package:flutter/material.dart';
  5. class MultiSelect extends StatefulWidget {
  6. final List<String> items;
  7. const MultiSelect({Key? key, required this.items}) : super(key: key);
  8. @override
  9. State<StatefulWidget> createState() => _MultiSelectState();
  10. }
  11. class _MultiSelectState extends State<MultiSelect> {
  12. // this variable holds the selected items
  13. final List<String> _selectedItems = [];
  14. // This function is triggered when a checkbox is checked or unchecked
  15. void _itemChange(String itemValue, bool isSelected) {
  16. setState(() {
  17. if (isSelected) {
  18. _selectedItems.add(itemValue);
  19. } else {
  20. _selectedItems.remove(itemValue);
  21. }
  22. });
  23. }
  24. // this function is called when the Cancel button is pressed
  25. void _cancel() {
  26. Navigator.pop(context);
  27. }
  28. // this function is called when the Submit button is tapped
  29. void _submit() {
  30. Navigator.pop(context, _selectedItems);
  31. }
  32. @override
  33. Widget build(BuildContext context) {
  34. return AlertDialog(
  35. title: const Text('Select Topics'),
  36. content: SingleChildScrollView(
  37. child: ListBody(
  38. children: widget.items
  39. .map((item) => CheckboxListTile(
  40. value: _selectedItems.contains(item),
  41. title: Text(item),
  42. controlAffinity: ListTileControlAffinity.leading,
  43. onChanged: (isChecked) => _itemChange(item, isChecked!),
  44. ))
  45. .toList(),
  46. ),
  47. ),
  48. actions: [
  49. TextButton(
  50. child: const Text('Cancel'),
  51. onPressed: _cancel,
  52. ),
  53. ElevatedButton(
  54. child: const Text('Submit'),
  55. onPressed: _submit,
  56. ),
  57. ],
  58. );
  59. }
  60. }