как проверить виджет textfieldfom формы, в которой есть 5 виджетов textfieldfom, один за другим во флаттере - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь проверить текстовое поле в форме и отображать предупреждение, если оно пустое.

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

Мой текущий код:

import 'package:flutter/material.dart';
void main(){
  runApp(new MaterialApp(
    home: new App(),
  ));
}
class App extends StatefulWidget {
  @override
  _AppState createState() => _AppState();
}

class _AppState extends State<App> {
  final GlobalKey<FormState> formkey = GlobalKey<FormState>();
  String _name,_last,_add;
  var alert;
 m(){
   if(_name.isEmpty){
     showDialog(context: context,
         child: new AlertDialog(
           title: new Text('name'),
         ));
   }
   else if(_last.isEmpty){

     showDialog(context: context,
         child: new AlertDialog(
           title: new Text('last'),
         ));
   }
   else {
       showDialog(context: context,
           child: new AlertDialog(
             title: new Text('add'),
           ));
   }
 }


  pressed() {
    var form = formkey.currentState;
    if (form.validate()) {
      form.save();
    }
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(),
      body: new Form(
        key: formkey,
          child: new ListView(
            children: <Widget>[
              new Text('name'),
              new TextFormField(
                validator: (str){
                  return str.isEmpty?m():null;
                },
              ),
              new Text('last'),
              new TextFormField(
                validator: (str){
                  return str.isEmpty? m():null;
                },
              ),
              new Text('add'),
              new TextFormField(
                validator: (str){
                  return str.isEmpty?m():null;
                },
              ),
              new RaisedButton(onPressed: pressed)
            ],
          )
        ),
    );
  }

1 Ответ

0 голосов
/ 03 июля 2018

Несколько вещей, на которые нужно указать. Во-первых, валидатор ожидает, что строка будет возвращена, чтобы он мог отобразить сообщение об ошибке под полем, но вы вызываете метод m (), который ничего не возвращает. См. документация валидатора . Например:

new Text("Name"),
new TextFormField(
    validator: (str){
        if (str.isEmpty) {
           return "Please enter a name";
        }
    },),

Если вы хотите иметь диалоговое окно с предупреждением вместо использования текста ошибки под полем, не используйте validator в каждом TextFormField или form.validate(). Проблема, связанная с этим подходом, заключается в том, что вы не захватываете какие-либо входные данные TextFormField. Для этого вы можете использовать свойство onSaved или назначить GlobalKey для каждого TextFormField. Я покажу метод onSaved:

new TextFormField(
    onSaved: (value){
        setState(() {
           _name = value
        });
    },),

Теперь, когда у вас есть значения, установленные в ваших переменных состояния, вы можете изменить pressed() на что-то вроде этого:

pressed() {
  var form = formkey.currentState;
  form.save(); //Calling form.save() in turns calls all TextFormField's onSaved function
  var errorMsg = ""
  if (_name.isEmpty) {
     errorMsg += "Name is empty\n";
  }
  if (_last.isEmpty) {
     errorMsg += "Last is empty\n";
  }
  if (_add.isEmpty) {
     errorMsg += "Add is empty";
  }

  //Print debug if errorMsg is not empty
  if (!errorMsg.isEmpty) (
     debugPrint(errorMsg);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...