Trim () входное значение любого TextField в форме по умолчанию в приложении флаттера - PullRequest
1 голос
/ 11 февраля 2020

У меня есть разные поля формы, и я хочу обрезать каждое значение поля формы по умолчанию до запуска метода validator.

Причина, по которой я хочу это сделать, заключается в том, что если я запускаю regex для входного значения при запуске метода validator, регулярное выражение вернет false в input_text.hasMatch из-за бесполезного пробела в конце входного значения.

Например. Код ниже на alphaNumericText.hasMatch(val) вернет false из-за бесполезных символов пробела в конце входного значения.

final alphaNumericText = RegExp(r'^[a-zA-Z0-9]+$');

TextFormField(
                  keyboardType: TextInputType.text,
                  decoration: new InputDecoration(
                    labelText: 'Enter your nickname',
                  ),
                  validator: (val) {
                    if (val.isEmpty == true) {
                      return 'Nickname is required!';
                    }
                    if (alphaNumericText.hasMatch(val) == false) {
                      return 'Use alphanumeric characters only in nickname.';
                    }
                    return null;
                  },
                  onSaved: (val) => this.nickname = val,
                ),

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

Я хочу, чтобы каждое значение во всех текстовых полях в форме было усечено / trim() по умолчанию перед методом validator называется.

Ответы [ 3 ]

4 голосов
/ 11 февраля 2020

просто добавьте

inputFormatters: [WhitelistingTextInputFormatter(RegExp(r'[a-zA-Z0-9]'))],

в качестве свойства к TextInputField, и пользователь даже не сможет набирать пробел или любые другие символы, кроме белого, и вы также можете удалить дополнительные проверки из валидатора

полный пример

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: SafeArea(
          child: Center(
            child: TextFormField(
              inputFormatters: [WhitelistingTextInputFormatter(RegExp(r'[a-zA-Z0-9]'))],
              keyboardType: TextInputType.text,
              decoration: new InputDecoration(
                labelText: 'Enter your nickname',
              ),
              validator: (val) {
                if (val.isEmpty == true) {
                  return 'Nickname is required!';
                }
                return null;
              },
              onSaved: (val) {},
            ),
          ),
        ),
      ),
    );
  }
}
2 голосов
/ 11 февраля 2020

Как и предполагал @ Dari sh, вот пример кода для него.

Однако, необходимо выбрать в конце text, если обрезается. Это будет работать, только если пробелы между ними запрещены.

class _MyHomePageState extends State<MyHomePage> {
  final alphaNumericText = RegExp(r'^[a-zA-Z0-9]+$');
  final textController = TextEditingController();

  @override
  void dispose() {
    super.dispose();
    textController?.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: TextFormField(
          controller: textController,
          keyboardType: TextInputType.text,
          decoration: new InputDecoration(
            labelText: 'Enter your nickname',
          ),
          onChanged: (val) {
            final trimVal = val.trim();
            if (val != trimVal)
              setState(() {
                textController.text = trimVal;
                textController.selection = TextSelection.fromPosition(TextPosition(offset: trimVal.length));
              });
          },
          validator: (val) {
            if (val.isEmpty == true) {
              return 'Nickname is required!';
            }
            if (alphaNumericText.hasMatch(val) == false) {
              return 'Use alphanumeric characters only in nickname.';
            }
            return null;
          },
        ),
      ),
    );
  }
}
1 голос
/ 11 февраля 2020

Обрезать текстовое значение при обратном вызове onChanged и назначить его обратно контроллеру.

...