трепетать Textfiled делает нежелательную перестройку - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть ListBuilder внутри MultiPageForm, который создает карту с 2 текстовыми полями на каждом касании «добавления». Раньше он работал просто отлично, но теперь это не так - при каждом нажатии на TextField страница перестраивается, и клавиатура закрывается, как только она открывается.

  List<AddIngredientItem> basic_ingredients = [];

Это ListBuilder

            ListView.builder(
              physics: NeverScrollableScrollPhysics(),
              shrinkWrap: true,
              itemCount: basic_ingredients.length,
              itemBuilder: (BuildContext context, index) {
                return Dismissible(
                    background: slideBackground("right"),
                    secondaryBackground: slideBackground("left"),
                    key: UniqueKey(),
                    onDismissed: (direction) {
                      setState(
                        () {
                          basic_ingredients.removeAt(index);
                        },
                      );
                    },
                    child: basic_ingredients[index]);
              },
            ),

Это класс, который создает карту с двумя текстовыми полями:

import 'package:flutter/material.dart';

class AddIngredientItem extends StatefulWidget {
  final _ingi_name_controller = TextEditingController();
  final _ingi_amount_controller = TextEditingController();
  final _measurement_controller = TextEditingController();
  AddIngredientItem();
  @override
  String toStringShort() {
    return _ingi_name_controller.text;
  }
  @override
  _AddIngredientItemState createState() => _AddIngredientItemState();
}

class _AddIngredientItemState extends State<AddIngredientItem> {
  List _measurements = ["1", "2", "3", "4", "5"];
  List<DropdownMenuItem<String>> _dropDownMenuItems;
  List<DropdownMenuItem<String>> getDropDownMenuItems() {
    List<DropdownMenuItem<String>> items = new List();
    for (String city in _measurements) {
      items.add(new DropdownMenuItem(value: city, child: new Text(city)));
    }
    return items;
  }

  @override
  void initState() {
    _dropDownMenuItems = getDropDownMenuItems();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Card(
      child: Padding(
        padding: const EdgeInsets.all(5.0),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: <Widget>[
            Expanded(
              child: TextFormField(
                controller: widget._ingi_name_controller,
                maxLines: 1,
                textAlign: TextAlign.center,
                style: TextStyle(
                  fontSize: 18.0,
                ),
                onChanged: (val) {
                  setState(() {});
                },
                decoration: InputDecoration(
                  border: UnderlineInputBorder(
                    borderSide:
                        BorderSide(color: Theme.of(context).primaryColor),
                  ),
                  hintText: 'hint',
                ),
              ),
            ),
            Flexible(
              child: TextFormField(
                controller: widget._ingi_amount_controller,
                keyboardType: TextInputType.number,
                textAlign: TextAlign.center,
                style: TextStyle(
                  fontSize: 18.0,
                ),
                maxLines: 1,
                onChanged: (val) {
                  setState(() {});
                },
                decoration: InputDecoration(
                  border: UnderlineInputBorder(
                    borderSide:
                        BorderSide(color: Theme.of(context).primaryColor),
                  ),
                  hintText: 'amount',
                ),
              ),
            ),
            Flexible(
                child: DropdownButton(
              hint: Center(
                  child: Text("unit", style: TextStyle(fontSize: 18))),
              value: widget._measurement_controller.text == ""
                  ? null
                  : widget._measurement_controller.text,
              items: _dropDownMenuItems,
              onChanged: (val) {
                widget._measurement_controller.text = val;
                setState(() {});
              },
            )),
          ],
        ),
      ),
    );
  }
}

Вопрос только в TextField, какие-либо предложения о том, как заставить его работать?

1 Ответ

0 голосов
/ 04 апреля 2020

Проблема была в Уникальности. Помогло его изменение на ValueKey.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...