Флаттер: Счетчик позиций для текстового поля

#flutter #dart

Вопрос:

В настоящее время я пытаюсь переместить счетчик текстового поля наверх (над фактическим полем ввода), и я не уверен, как это сделать.

В настоящий момент: введите описание изображения здесь

Поэтому счетчик следует переместить в правый верхний угол над полем поля ввода. Я пытался подумать о создании нового счетчика, но должен быть более простой способ сделать это? Я также попытался поэкспериментировать с дизайном ввода, но, похоже, ничего не работает.

 TextFormField(
      maxLength: 1000,
      decoration: InputDecoration(
        labelText: label,
        labelStyle: TextStyle(fontSize: 30,
      ),
    )
 

Был бы признателен за некоторую помощь, спасибо в андвансе!

Ответ №1:

Короткий путь-это использование buildCounter с transform . Но это будет содержать несколько дополнительных пробелов, и я думаю, что это в некотором роде нормально.

  TextFormField(
              maxLength: 1000,
              buildCounter: (context,
                  {required currentLength, required isFocused, maxLength}) {
                return Container(
                  transform: Matrix4.translationValues(0, -kToolbarHeight, 0),
                  child: Text("$currentLength/$maxLength"),
                );
              },
            ),
 

Другим способом TextEditingController и Column

   final TextEditingController controller = TextEditingController();
  final maxLength = 1000;

  @override
  void initState() {
    controller.addListener(() {
      setState(() {});
    });
    super.initState();
  }

 
  Column(
              children: [
                Align(
                  alignment: Alignment.centerRight,
                  child: Text("${controller.text.length}/$maxLength"),
                ),
                TextFormField(
                  key: ValueKey("textFiled in Column"),
                  controller: controller,
                  buildCounter: (context,
                          {required currentLength,
                          required isFocused,
                          maxLength}) =>
                      SizedBox(),
                ),
              ],
            ),
 

Результат

введите описание изображения здесь

Комментарии:

1. Это работает очень хорошо, но это довольно странно, так как, когда я использую kToolbarHeight, и в моем случае поле немного больше, чем поле, которое я отобразил в своем вопросе, мне нужно умножить kToolbarHeight, чтобы на самом деле получить его над полем, иначе оно внутри поля. Есть ли способ сделать это согласованным, используя некоторое позиционирование?

2. TextField высота зависит от размера родителей, вы можете передать его туда, иначе попробуйте мой 2-й вариант Another way TextEditingController and Column