GithubHelp home page GithubHelp logo

Comments (2)

AhmedLSayed9 avatar AhmedLSayed9 commented on July 18, 2024

Can you try this using the last version 3.0.0-beta.6?
If you still have an issue, you can share a minimal working sample.

from dropdown_button2.

eriCCsan avatar eriCCsan commented on July 18, 2024

Thy it works now!
The guy who implemented dropdownSeparatorsaved my live :)
Here is my approach:

class TextDropDownFormField extends ConsumerStatefulWidget {
  final List<KeyValuePair> keyValueList;
  final String? Function(String?)? validator;
  final FloatingInputDecoration inputDecoration;
  final TextStyle listTextStyle;
  final TextEditingController controller;
  final String searchHint;

  static const double menuItemHeight = 50.0;

  String? selected;
  TextDropDownFormField(
      {required List<KeyValuePair> this.keyValueList,
      required this.validator,
      required this.inputDecoration,
      required this.listTextStyle,
      required this.controller,
      required this.searchHint,
      Key? key})
      : super(key: key);

  @override
  TextDropDownFormFieldState createState() => TextDropDownFormFieldState();
}

class TextDropDownFormFieldState extends ConsumerState<TextDropDownFormField> {
  @override
  void initState() {
    widget.selected = widget.controller.text;
    super.initState();
  }

  String? selectedValue;
  final TextEditingController textEditingController = TextEditingController();

  @override
  void dispose() {
    textEditingController.dispose();
    super.dispose();
  }

  List<DropdownItem<String>> _addDividersAfterItems(
      List<KeyValuePair> keyValueList) {
    final List<DropdownItem<String>> menuItems = [];
    for (final KeyValuePair item in keyValueList) {
      menuItems
        ..add(DropdownItem(
          value: item.getValue(),
          child: Text(
            item.getKey(),
            overflow: TextOverflow.ellipsis,
          ),
        ));
    }
    return menuItems;
  }

  @override
  Widget build(BuildContext context) {
    return DropdownButtonHideUnderline(
      child: DropdownButtonFormField2<String>(
        isExpanded: true,
        decoration: widget.inputDecoration,
        value: selectedValue,
        onChanged: (value) {
          widget.controller.text = value ?? "";
          setState(() {
            selectedValue = value;
          });
        },
        dropdownSeparator: const DropdownSeparator(
          height: 4,
          child: Padding(
            padding: EdgeInsets.symmetric(horizontal: 8.0),
            child: Divider(),
          ),
        ),
        hint: Text(widget.inputDecoration.hintText ?? ""),
        items: _addDividersAfterItems(widget.keyValueList),
        validator: widget.validator,
        dropdownStyleData: const DropdownStyleData(
            maxHeight: (TextDropDownFormField.menuItemHeight * 4) + 4,
            padding: EdgeInsets.all(0.0)),
        menuItemStyleData: MenuItemStyleData(
          padding: const EdgeInsets.symmetric(horizontal: 10),
          overlayColor: MaterialStateProperty.all(Colors.transparent),
        ),

        dropdownSearchData: widget.keyValueList.length > 4
            ? DropdownSearchData(
                searchController: textEditingController,
                searchBarWidgetHeight: TextDropDownFormField.menuItemHeight,
                searchBarWidget: Container(
                  height: TextDropDownFormField.menuItemHeight,
                  padding: const EdgeInsets.all(5.0),
                  child: TextFormField(
                    controller: textEditingController,
                    decoration: InputDecoration(
                      contentPadding: const EdgeInsets.symmetric(
                        horizontal: 10,
                        vertical: 8,
                      ),
                      hintText: widget.searchHint,
                      border: OutlineInputBorder(
                        borderRadius: BorderRadius.circular(5),
                      ),
                    ),
                  ),
                ),
                searchMatchFn: (item, searchValue) {
                  return item.value
                      .toString()
                      .toLowerCase()
                      .contains(searchValue.toLowerCase());
                },
              )
            : null,
        onMenuStateChange: (isOpen) {
          if (!isOpen) {
            textEditingController.clear();
          }
        },
      ),
    );
  }
}

from dropdown_button2.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.