Как получить цвет текста TextFormField, размер шрифта и т. Д. С помощью контроллера во флаттере?

Я создаю собственный класс textformfield и использую его как виджет. Я хочу получить цвет текстовых полей, размер шрифта, выравнивание и т. Д., Которые я установил. Как я могу получить все эти свойства, которые я установил для текстового поля, используя контроллер или что-то еще?

Мой собственный код класса:

class CustomTextNIconWidget extends StatefulWidget {

  final Color fontColor;
  final GestureTapCallback onSingleTapWidget;
  final GestureTapCallback onDoubleTapWidget;

  final FontWeight fontWeight;

  final TextEditingController controller;

  final double fontSize;

  CustomTextNIconWidget(
      {Key key,
      @required this.hint,
      this.controller,
      this.fontSize,

      this.fontColor,

      this.fontWeight,
      this.textAlign,
      this.onSingleTapWidget,
      this.onDoubleTapWidget})
      : super(key: key);

  @override
  _CustomTextNIconWidgetState createState() => _CustomTextNIconWidgetState();
}

class _CustomTextNIconWidgetState extends State<CustomTextNIconWidget> {
  @override
  Widget build(BuildContext context) {
    return InkWell(
      onTap: widget.onSingleTapWidget,
      onDoubleTap: widget.onDoubleTapWidget,
      child: Container(
        child: TextFormField(
          controller: widget.controller,
          style: TextStyle(
              color: widget.fontColor,
              fontSize:
                  widget.fontSize == null ? getFontSize() : widget.fontSize,
              fontWeight: widget.fontWeight == null
                  ? getFontWeight()
                  : widget.fontWeight),
          decoration: InputDecoration(
              hintText: widget.hint,
              hintStyle: TextStyle(color:white)),

        ),
      ),
    );
  }

Я использовал как:

CustomTextNIconWidget(
                    controller: myController,
                    hint: getAddress(),
                    fontColor: Colors.amber,
                    fontSize: 18,
                    fontWeight: FontWeight.bold,
                    onSingleTapWidget: (){
                      print("Text color,fontsize:{HowToGetAboveSetProperties}");
                    },
                  ),





person Arun Anim    schedule 31.12.2019    source источник


Ответы (1)


Для этого вам нужно использовать GlobalKey. Создайте GlobalKey<_CustomTextNIconWidgetState> следующим образом:

GlobalKey<_CustomTextNIconWidgetState> _customTextNIconWidgetStateKey = GlobalKey<_CustomTextNIconWidgetState>();

укажите этот ключ в качестве параметра вашего пользовательского виджета как:

CustomTextNIconWidget(
  key: _customTextNIconWidgetStateKey, // <-- key
  controller: myController,
  hint: getAddress(),
  fontColor: Colors.amber,
  fontSize: 18,
  fontWeight: FontWeight.bold,
  onSingleTapWidget: (){
    print("Text color,fontsize:{HowToGetAboveSetProperties}");
  },
),

После того, как виджеты помещены в дерево виджетов, вы можете получить доступ к параметрам с помощью:

_customTextNIconWidgetStateKey.currentState.widget

Например, чтобы получить доступ к fontColor, вы можете сделать это:

Color _fontColor = _customTextNIconWidgetStateKey.currentState.widget.fontColor;

Чтобы дождаться, пока виджет будет помещен в дерево виджетов и получит обратный вызов для этого же, вы можете использовать WidgetsBinding.instance.addPostFrameCallback((_){})

используйте это в своем состоянии инициализации или методе сборки.

WidgetsBinding.instance.addPostFrameCallback((_){
    Color _fontColor = _customTextNIconWidgetStateKey.currentState.widget.fontColor;
});

Чтобы использовать этот ключ в другом файле дротика, в котором объявлен ваш _CustomTextNIconWidgetState, вам нужно будет сделать его общедоступным (переименовав его в CustomTextNIconWidgetState).

После того, как вы внесете все указанные выше изменения, у вас будет код, похожий на следующий:

class MyApp extends StatelessWidget {

  GlobalKey<CustomTextNIconWidgetState> _customTextNIconWidgetStateKey = GlobalKey<CustomTextNIconWidgetState>();

  @override
  Widget build(BuildContext context) {

    WidgetsBinding.instance.addPostFrameCallback((_){
      Color _fontColor = _customTextNIconWidgetStateKey.currentState.widget.fontColor;
    });

    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        body: Center(
          child: CustomTextNIconWidget(
            key: _customTextNIconWidgetStateKey, // <-- key
            controller: myController,
            hint: getAddress(),
            fontColor: Colors.amber,
            fontSize: 18,
            fontWeight: FontWeight.bold,
            onSingleTapWidget: (){
              print("Text color,fontsize:{HowToGetAboveSetProperties}");
            },
          ),
        ),
      ),
    );
  }
}

Надеюсь, это поможет, в случае сомнений прокомментируйте. Если этот ответ вам поможет, примите предложение и проголосуйте "за".

person Kalpesh Kundanani    schedule 31.12.2019
comment
Это было здорово, но это не дает мне цвет виджета, который я нажимал. Он всегда дает цвет как: MaterialColor (основное значение: Color (0xff2196f3) - person Arun Anim; 31.12.2019