Получить текст из TextWidget flutter - PullRequest
1 голос
/ 26 мая 2020

Я создаю приложение погоды, в котором я предоставляю строку местоположения для TextField и извлекаю текст внутри него. Я знаю, что смогу это сделать, если буду использовать виджет TextField каждый раз, но я хочу использовать возможность повторного использования кода, и поэтому я создал другой виджет под названием TextFieldWidget, в котором я предоставляю переменную подсказки, которая возвращает текст внутри него. Не знаю, как вернуть текст. Это мой код.

import 'package:flutter/material.dart';

class TextFieldWidget extends StatefulWidget {

  final String _hint;

  TextFieldWidget(this._hint);

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

class _TextFieldWidgetState extends State<TextFieldWidget> {

  TextEditingController _textEditingController;
  InputDecoration _inputdecoration;

  @override
  void initState() {
    super.initState();
    _textEditingController = TextEditingController();
    _inputdecoration = InputDecoration(hintText: widget._hint,floatingLabelBehavior: FloatingLabelBehavior.always);
  }

  @override
  Widget build(BuildContext context) {
    return TextField(
      autocorrect: true,
      controller: _textEditingController,
      keyboardType: TextInputType.text,
      enableSuggestions: true,
      decoration: _inputdecoration,
      onSubmitted: (value){
          // somehow return data
          // I want to access this part..
      },
    );
  }
}

1 Ответ

1 голос
/ 26 мая 2020

1. Вы должны создать один метод внутри вызывающего класса

void _setTextValue(String value) {
  // Submitted text should appear here from value
}


TextFieldWidget(_setTextValue)

2. Используйте это внутри TextFormField, затем

  final Function _setValue;

  TextFieldWidget(this._setValue);

3. Внутри onSubmitted Call

widget._setValue(value);

Наконец, вы получите значение внутри вызывающего класса

Отредактировано:

Мы можем добавить обратные вызовы в вызов сам виджеты с именованными параметрами, что является правильным способом сделать это

Пример:

class _TextFieldWidgetState extends State<TextFieldWidget> {

  TextEditingController _textEditingController;
  InputDecoration _inputdecoration;

  @override
  void initState() {
    super.initState();
    _textEditingController = TextEditingController();
    _inputdecoration = InputDecoration(hintText: 'UserName',floatingLabelBehavior: FloatingLabelBehavior.always);
  }

  @override
  Widget build(BuildContext context) {
    return TextField(
      autocorrect: true,
      controller: _textEditingController,
      keyboardType: TextInputType.text,
      enableSuggestions: true,
      decoration: _inputdecoration,
      onSubmitted: (value){
        widget.getUserName(value);
        // somehow return data
        // I want to access this part..
      },
    );
  }
}

Вызовите код выше, например

TextFieldWidget(getUserName: (value) {
         // Get the username here
         print(value);
       }),

Примечание: мы можем добавить столько именованных параметров, как этот

...