EJ Selector Button

A flutter widget that works like dropdown button, except that instead of opening the dropdown to select items, it opens a dialog. Also, You can customize its button and items. Or you can show dialog for selecting item using showEJDialog.

Usage

You can customize EJSelectorButton or use its string factory which is less customizable and easier to use.

EJSelectorButton.string(
  items: List.generate(10, (index) => 'item $index'),
  hint: 'Choose',
  useValue: false,
  divider: Divider(),
  textStyle: TextStyle(fontSize: 18),
  suffix: Icon(Icons.arrow_drop_down),
)
final items = <ItemModel>[
  ItemModel(1, 'First Item'),
  ItemModel(2, 'Second Item'),
  ItemModel(3, 'Third Item'),
  ItemModel(4, 'Forth Item'),
  ItemModel(5, 'Fifth Item'),
];

EJSelectorButton<ItemModel>(
 useValue: false,
 hint: Text(
    'Click to choose',
    style: TextStyle(fontSize: 16, color: Colors.black),
 ),
 buttonBuilder: (child, value) => Container(
  alignment: Alignment.center,
  height: 60,
  width: 150,
  decoration: BoxDecoration(
  borderRadius: BorderRadius.circular(4),
  color: Colors.white,
 ),
 child: value != null
      ? Text(
         value.name,
         style: TextStyle(fontSize: 16, color: Colors.black),
        )
      : child,
 ),
 selectedWidgetBuilder: (valueOfSelected) => Container(
  padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 32),
  child: Text(
     valueOfSelected.name,
     style: TextStyle(fontSize: 20, color: Colors.blue),
    ),
 ),
 items: items
     .map(
       (item) => EJSelectorItem(
        value: item,
        widget: Container(
        padding:
           const EdgeInsets.symmetric(vertical: 16, horizontal: 32),
        child: Text(
         item.name,
         style: TextStyle(fontSize: 16),
        ),
      ),
     ),
    ).toList(),
)

class ItemModel {
  ItemModel(this.id, this.name);

  final int id;
  final String name;
}

Using as Function

final s = await showEJDialog<int>(
     context: context,
     selected: selectedId,
     selectedWidgetBuilder: (selectedId) => Container(
     padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 32),
     child: Text(
     items.firstWhere((item) => item.id == selectedId).name,
     style: TextStyle(fontSize: 20, color: Colors.blue),
    ),
 ),
    items: items
        .map(
          (item) => EJSelectorItem(
             value: item.id,
             widget: Container(
             padding: const EdgeInsets.symmetric(
             vertical: 16, horizontal: 32),
             child: Text(
                item.name,
                style: TextStyle(fontSize: 16),
               ),
            ),
         ),
      ) .toList(),
);
if (s != null) {
     setState(() {
     selectedId = s.value;
    });
 }

Libraries

ej_selector