Last active
February 8, 2021 09:58
-
-
Save Zujaj/dc2718d0db9c89b32f1be6a3d26b8d35 to your computer and use it in GitHub Desktop.
A Custom Dialog that displays a single title & list of options.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:flutter/material.dart'; | |
/// A Custom Dialog that displays a single question & list of answers. | |
class MultiSelectDialog extends StatelessWidget { | |
/// List to display the answer. | |
final List<String> answers; | |
/// Widget to display the question. | |
final Widget question; | |
/// List to hold the selected answer | |
/// i.e. ['a'] or ['a','b'] or ['a','b','c'] etc. | |
final List<String> selectedItems = []; | |
/// Map that holds selected option with a boolean value | |
/// i.e. { 'a' : false}. | |
static Map<String, bool> mappedItem; | |
MultiSelectDialog({this.answers, this.question}); | |
/// Function that converts the list answer to a map. | |
Map<String, bool> initMap() { | |
return mappedItem = Map.fromIterable(answers, | |
key: (k) => k.toString(), | |
value: (v) { | |
if (v != true && v != false) | |
return false; | |
else | |
return v as bool; | |
}); | |
} | |
@override | |
Widget build(BuildContext context) { | |
if (mappedItem == null) { | |
initMap(); | |
} | |
return SimpleDialog( | |
title: question, | |
children: [ | |
...mappedItem.keys.map((String key) { | |
return StatefulBuilder( | |
builder: (_, StateSetter setState) => CheckboxListTile( | |
title: Text(key), // Displays the option | |
value: mappedItem[key], // Displays checked or unchecked value | |
controlAffinity: ListTileControlAffinity.platform, | |
onChanged: (value) => setState(() => mappedItem[key] = value)), | |
); | |
}).toList(), | |
Align( | |
alignment: Alignment.center, | |
child: ElevatedButton( | |
style: ButtonStyle(visualDensity: VisualDensity.comfortable), | |
child: Text('Submit'), | |
onPressed: () { | |
// Clear the list | |
selectedItems.clear(); | |
// Traverse each map entry | |
mappedItem.forEach((key, value) { | |
if (value == true) { | |
selectedItems.add(key); | |
} | |
}); | |
// Close the Dialog & return selectedItems | |
Navigator.pop(context, selectedItems); | |
})) | |
], | |
); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment