Ten Digit Grid
Ten Digit Grid

Reputation: 2679

Flutter Autocomplete TextFormField() is overflowing off the right side of the screen

I have an InPutDecorator that looks liek this with Autocomplete:

          // ********** Item Type Auto Compleate Start
          InputDecorator(
            decoration: const InputDecoration(
              icon: Icon(Icons.style),
              border: InputBorder.none,
            ),
            child: Autocomplete<String>(
                optionsBuilder: (TextEditingValue textEditingValue) {
              if (textEditingValue.text == '') {
                return itemTypeList;
              }
              return itemTypeList.where((String option) {
                return option
                    .toLowerCase()
                    .contains(textEditingValue.text.toLowerCase());
              });
            }, fieldViewBuilder:
                    (context, controller, focusNode, onEditingComplete) {
              itemTypeController = controller;

              return Focus(
                onFocusChange: (hasFocus) {
                  if (temperatureItemTypes
                      .contains(itemTypeController.text.trim())) {
                    //show temperature field
                    setState(() {
                      temperatureField = true;
                    });
                  } else {
                    setState(() {
                      temperatureField = false;
                    });
                  }
                  if (volumeItemTypes
                      .contains(itemTypeController.text.trim())) {
                    //show temperature field
                    setState(() {
                      volumeField = true;
                    });
                  } else {
                    setState(() {
                      volumeField = false;
                    });
                  }
                },
                child: TextFormField(
                  controller: controller,
                  focusNode: focusNode,
                  onEditingComplete: onEditingComplete,
                  decoration: const InputDecoration(
                    labelText: "Item type*",
                    hintText: 'What is the item?',
                  ),
                ),
              );
            }),
          ),

For some reason the auto complete box is huge and extends off the screen to the right:

enter image description here

I tried looking at the Widget inspector and it seems like the autocomplete is breaking out of the constraints of the textFormField which is odd.

I also tried wrapping the auto complete in a container but flutter said it was redundant.

It looks like its a bug in Flutter, and I read through this stack overflow which was similar: Flutter 2.0 - Autocomplete widget goes out of screen from right side

BUthad trouble adapting their code to mine. I think we are approaching it slightly different and I am having trouble understanding.

Upvotes: 1

Views: 1225

Answers (1)

pmatatias
pmatatias

Reputation: 4454

Here's a simple demo: https://dartpad.dev/?id=343ba572874e3d11fb4e62e1069e2200

To apply this to your code, just apply all your properties.

I haven't tested this yet since you didn't provide example data, but in my example dartpad above, it works fine.

LayoutBuilder(
  builder: (context, constraints) => InputDecorator(
    decoration: const InputDecoration(
      icon: Icon(Icons.style),
      border: InputBorder.none,
    ),
  child: RawAutocomplete<String>(
   // first property
   optionsBuilder: (TextEditingValue textEditingValue) {
    if (textEditingValue.text == '') {
      return itemTypeList;
    }
    return itemTypeList.where((String option) {
      return option
          .toLowerCase()
          .contains(textEditingValue.text.toLowerCase());
    });
  }, 

  //second property where you can limit the overlay pop up suggestion 
  optionsViewBuilder: (BuildContext context,
      AutocompleteOnSelected<String> onSelected,
      Iterable<String> options) {
    return Align(
      alignment: Alignment.topLeft,
      child: Material(
        elevation: 4.0,
        child: SizedBox(
          height: 200.0,
          // set width based on you need
          width: constraints.biggest.width*0.8,
          child: ListView.builder(
            padding: const EdgeInsets.all(8.0),
            itemCount: options.length,
            itemBuilder: (BuildContext context, int index) {
              final String option = options.elementAt(index);
              return GestureDetector(
                onTap: () {
                  onSelected(option);
                },
                child: ListTile(
                  title: Text(option),
                ),
              );
            },
          ),
        ),
      ),
    );
  },
  
  // third property
  fieldViewBuilder:
          (context, controller, focusNode, onEditingComplete) {
    itemTypeController = controller;

    return Focus(
      onFocusChange: (hasFocus) {
        if (temperatureItemTypes
            .contains(itemTypeController.text.trim())) {
          //show temperature field
          setState(() {
            temperatureField = true;
          });
        } else {
          setState(() {
            temperatureField = false;
          });
        }
        if (volumeItemTypes
            .contains(itemTypeController.text.trim())) {
          //show temperature field
          setState(() {
            volumeField = true;
          });
        } else {
          setState(() {
            volumeField = false;
          });
        }
      },
      child: TextFormField(
        controller: controller,
        focusNode: focusNode,
        onEditingComplete: onEditingComplete,
        decoration: const InputDecoration(
          labelText: "Item type*",
          hintText: 'What is the item?',
        ),
      ),
    );
  }),
 ),
),

Upvotes: 3

Related Questions