import 'package:flutter/material.dart'; class ListPreference extends StatelessWidget { final String title; final String currentOption; final List options; final Function onChange; final bool enabled; ListPreference({ @required this.title, @required this.currentOption, @required this.options, @required this.onChange, this.enabled = true, }); @override Widget build(BuildContext context) { return ListTile( title: Text(title), subtitle: Text(currentOption), onTap: () async { var option = await showDialog( context: context, builder: (BuildContext context) { var children = []; for (var o in options) { var tile = LabeledRadio( label: o, value: o, groupValue: currentOption, onChanged: (String val) { Navigator.of(context).pop(val); }, ); children.add(tile); } return AlertDialog( title: Text(title), content: Column( children: children, mainAxisSize: MainAxisSize.min, ), actions: [ FlatButton( child: const Text('CANCEL'), onPressed: () { Navigator.of(context).pop(); }, ) ], ); }); if (option != null) { onChange(option); } }, enabled: enabled, ); } } class LabeledRadio extends StatelessWidget { const LabeledRadio({ this.label, this.groupValue, this.value, this.onChanged, }); final String label; final String groupValue; final String value; final Function onChanged; @override Widget build(BuildContext context) { return InkWell( onTap: () { if (value != groupValue) onChanged(value); }, child: Row( children: [ Radio( groupValue: groupValue, value: value, onChanged: onChanged, ), Text(label), ], ), ); } }