Как прописать значение текстового поля первой буквой первого слова после полной остановки «.»?

#flutter #dart #textfield

Вопрос:

Возможно ли такое?

пример: «Мой любимый фильм — «Матрица». И я думаю… »

подобные вопросы задавались и раньше, но они для простой прописной буквы первой буквы первого слова и не более

эти коды просто работали для первой буквы первого слова и не могут понять «.»

 extension CapExtension on String {
  String get inCaps =>
      this.length > 0 ? '${this[0].toUpperCase()}${this.substring(1)}' : '';

  String get capitalizeFirstofEach => this
      .replaceAll(RegExp('  '), ' ')
      .split(" ")
      .map((str) => str.inCaps)
      .join(" ");
}

 
 class CapitalCaseTextFormatter extends TextInputFormatter {
  @override
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {
    return TextEditingValue(
      text: newValue.text.inCaps,
      selection: newValue.selection,
    );
  }
}

 
 TextFormField(
   inputFormatters: [
            CapitalCaseTextFormatter()
                  ]
)
 

Ответ №1:

Используйте это для заглавной буквы каждого первого слова предложения

 
extension CapExtension on String {
  String capitalizeSentence() {
  // Each sentence becomes an array element
  var sentences = this.split('.');
  // Initialize string as empty string
  var output = '';
  // Loop through each sentence
  for (var sen in sentences) {
    // Trim leading and trailing whitespace
    var trimmed = sen.trim();
    // Capitalize first letter of current sentence
    var capitalized = "${trimmed[0].toUpperCase()   trimmed.substring(1)}";
    // Add current sentence to output with a period
    output  = capitalized   ". ";
  }
  return output;
}
}
 

// Форматирование ввода текста

 class CapitalCaseTextFormatter extends TextInputFormatter {
  @override
  TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, TextEditingValue newValue) {
    return TextEditingValue(
      text: newValue.text.capitalizeSentence,
      selection: newValue.selection,
    );
  }
}
 

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

1. это не работает для меня, внутри inputFormatters: [ CapitalCaseTextFormatter() ] можно напечатать только одну букву TextFormField . например: «А».

2. когда я включаю его _contentController.text.capitalizeSentence , это работает. но генерируйте сентенцию вот так: Хей. Как. Являются. Вы?.

3. я думаю, ты что-то не так понял, это не он.

4. @Husen обнаружил вашу проблему, потому что после каждого слова он вызывает значение с заглавной буквы и заканчивается точкой (.), которую вы можете вызвать с помощью TextInputFormatter

5. Я думаю, что его нужно слушать, набирая».», не добавляйте «.» в конец предложения.

Ответ №2:

Добавить textCapitalization свойство

 TextFormField(
   textCapitalization: TextCapitalization.sentences,
   inputFormatters: [
            CapitalCaseTextFormatter() //no need of it then
                  ]
)
 

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

1. Как я могу сделать это в режиме реального времени при вводе текста внутри TextFormField ?

2. добавление капитализации текста отражает изменения при вводе текста и начале нового предложения.