Flutter - создает виджет, расширяющий TextField с указанными значениями c - PullRequest
1 голос
/ 05 февраля 2020

В настоящее время я работаю над способом перевода ромадзи в хирагану прямо в моем TextField. Мне удалось получить что-то работающее:

class RomajiTextInput extends StatefulWidget{
  final bool mustConvertToKana;

  const RomajiTextInput({Key key, this.mustConvertToKana}) : super(key: key);

  @override
  State<StatefulWidget> createState() => _RomajiTextInputState();
}


class _RomajiTextInputState extends State<RomajiTextInput> {

  TextEditingController _titleEditingController;
  TextEditingController _hiddenTitleEditingController;
  String previousValue = "";

  @override
  void initState() {
    super.initState();
    _titleEditingController = new TextEditingController();
    _hiddenTitleEditingController = new TextEditingController();
  }

  @override
  void dispose() {
    super.dispose();
    _titleEditingController.clear();
    _hiddenTitleEditingController.clear();
  }




  void onConversionChanged(String text){
    if (widget.mustConvertToKana){
      _hiddenTitleEditingController.text = getRomConversion(text, onlyRomaji: false);
      String japanese = getJapaneseTranslation(_hiddenTitleEditingController.text, hasSpace: true);
      int cursor = getCursorPosition(previousValue, japanese);
      setState(() {
        _titleEditingController.text = japanese;
        _titleEditingController.selection = TextSelection.fromPosition(TextPosition(offset: japanese.length));
        previousValue = japanese;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return TextField(
      controller: _titleEditingController,
      onChanged: (text){
        onConversionChanged(text);
      },
      decoration: InputDecoration(
          labelText: 'Question',
          labelStyle: TextStyle(fontSize: 20),
          hintText:
          'Enter a question / a word to remember'),
    );
  }
}

Однако я хотел бы создать виджет, используя эти свойства, но также который может переопределить все различные поля TextField, такие как «украшение», добавить некоторые логи c в метод «onChanged» или даже добавить другие функции из виджета TextField, такие как «onEditingComplete». На самом деле я хотел бы иметь возможность сделать что-то вроде этого:

RomajiTextInput(
  controller: myChildController,
  onChanged: (text){print('text');} //And still convert to hiragana thanks to "onConversionChanged"
  decoration: InputDecoration(...) //All options that have not been mentioned are kept otherwise just added
)

Могу поспорить, что есть способ сделать это, но расширение виджета TextField меня никуда не привело ... Заранее спасибо :)

...