Значение TextFormField равно нулю - PullRequest
0 голосов
/ 06 июня 2019

Я пытался получить значение TextFormField.Но результат равен null

главной странице,

children:[
  UrlTextField(),
  UsernameTextField(),
  UrlButton()
]

UrlTextField (), так же, как UsernameTextField ()

class UrlTextField extends StatelessWidget {
  final myController = TextEditingController();
  @override
  Widget build(BuildContext context) {
    return AppTextField(
      decoration:
          InputDecoration(prefixText: "https://", labelText: "Enter your URL"),
      myController: myController,
      textInputType:  TextInputType.url,
    );}}

AppTextField () Это общий класс, я использовал этот класс везде

class AppTextField extends StatelessWidget {
  final InputDecoration decoration;
  var myController = TextEditingController();
  final TextInputType textInputType;
  AppTextField({
    this.decoration,
    this.myController,
    this.textInputType
  });

  @override
  Widget build(BuildContext context) {
    return TextFormField(
        controller: myController,
        keyboardType: textInputType,
        textAlign: TextAlign.left,
        decoration: decoration
    );}}

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

class UrlButton extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return AppButton(
        onPressed: () {
          String url = UrlTextField().myController.text;
          String username = UsernameTextField().myController.text;
          print('url is $text');
        });}}

AppButton () Этот класс также распространен

class AppButton extends StatelessWidget {
  final VoidCallback onPressed;
  AppButton({
    this.buttonTextStyle
  });

  @override
  Widget build(BuildContext context) {
    return RaisedButton(
      child: Text(...),
      onPressed: onPressed);}}

Ответы [ 3 ]

2 голосов
/ 06 июня 2019

Вы пытаетесь извлечь текст из контроллера, который был только что создан в onPressed кнопки, поэтому пока не может быть никакого текста!Чтобы решить эту проблему, вам нужен какой-то способ управления состоянием для доступа и изменения существующего виджета, в вашем случае - виджета UrlTextField.Я приведу пример того, как вы могли бы решить эту проблему быстро:

Главная страница:

class MainPage extends StatefulWidget {
    ...
    @override
    createState() => _MainPageState();
}

class _MainPageState extends State<MainPage> {
    UrlTextField _urlTextField = UrlTextField();
    ...

    children:[
      _urlTextField,
      UsernameTextField(),
      UrlButton(_urlTextField)
    ]

Теперь мы создали экземпляр UrlTextField, на который можно ссылаться и который можно передать другомувиджет как ваш UrlButton:

class UrlButton extends StatelessWidget {
    final UrlTextField urlTextField;

    UrlButton(this.urlTextField);

    @override
    Widget build(BuildContext context) {
        return AppButton(
            onPressed: () {
                String url = this.urlTextField.myController.text;
                String username = UsernameTextField().myController.text;
                print('url is $text');
            }
        );
    }
}

Таким образом, вы создали один экземпляр UrlTextField и использовали его на своей главной странице, где пользователь может заполнить некоторый ввод, и передали его в UrlButton, где выможет получить доступ к своему контроллеру и, следовательно, к его тексту.

Я бы порекомендовал вам подробнее ознакомиться с темой «Управление государством», поскольку существует множество способов справиться с таким делом.Я могу порекомендовать вам взглянуть на Provider, который очень прост в использовании и удобен для доступа к определенным данным.

0 голосов
/ 06 июня 2019

Я думаю, это то, что вы пытаетесь сделать .... Но есть много дыр в петле, брат .. Помните одну вещь. Вам нужны отдельные контроллеры для каждого TextField, вы не можете объявить один как myController и назначить его всем. Все они будут иметь одинаковое значение.

class StackHelp extends StatefulWidget {
  @override
  _StackHelp createState() => _StackHelp();
}

class _StackHelp extends State<StackHelp> {
  final TextEditingController myController = TextEditingController();

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: new Scaffold(
          body: Column(children: <Widget>[
        UrlTextField(myController),
        // UsernameTextField(),
        UrlButton(myController)
      ])),
    );
  }
}

class UrlTextField extends StatelessWidget {
  final TextEditingController myController;
  UrlTextField(this.myController);

  @override
  Widget build(BuildContext context) {
    return AppTextField(
      decoration:
          InputDecoration(prefixText: "https://", labelText: "Enter your URL"),
      myController: myController,
      textInputType: TextInputType.url,
    );
  }
}

class AppTextField extends StatelessWidget {
  final InputDecoration decoration;
  final TextEditingController myController;
  final TextInputType textInputType;
  AppTextField({this.decoration, this.myController, this.textInputType});

  @override
  Widget build(BuildContext context) {
    return TextFormField(
        controller: myController,
        keyboardType: textInputType,
        textAlign: TextAlign.left,
        decoration: decoration);
  }
}

class UrlButton extends StatelessWidget {
  final TextEditingController myController;
  UrlButton(this.myController);

  @override
  Widget build(BuildContext context) {
    void onPressed() {
      String url = this.myController.text;
      // String username = UsernameTextField().myController.text;
      print('url is $url');
    }

    return AppButton(onPressed);
  }
}

class AppButton extends StatelessWidget {
  final VoidCallback onPressed;
  AppButton(this.onPressed);

  @override
  Widget build(BuildContext context) {
    return RaisedButton(child: Text('Test'), onPressed: onPressed);
  }
}

0 голосов
/ 06 июня 2019

каково значение text в print('url is $text'); не должно ли быть так print('url is $url');

...