颤振| TextFormField验证器无法正常工作 - 方法'validate'在null上调用

问题描述 投票:1回答:1

我正在尝试为新的flutter应用程序构建一个简单的登录页面。小部件树非常基本。它由包含脚手架的MaterialApp组成。 Scaffold的“home”是一个StatefulWidget,它包含Form里面有两个TextFormFields。

TextFormFields具有'validator'代码来检查空值。

按下时会有一个按钮调用方法'validateAndSave'。在这个方法中,我为GlobalKey的一个实例调用'validate'方法。

单击按钮时,验证器似乎没有触发,我收到以下错误消息:

I/flutter (10459): ══╡ EXCEPTION CAUGHT BY GESTURE ╞═══════════════════════════════════════════════════════════════════
I/flutter (10459): The following NoSuchMethodError was thrown while handling a gesture:
I/flutter (10459): The method 'validate' was called on null.
I/flutter (10459): Receiver: null
I/flutter (10459): Tried calling: validate()
I/flutter (10459): 
I/flutter (10459): When the exception was thrown, this was the stack:
I/flutter (10459): #0      Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:50:5)
I/flutter (10459): #1      _LoginForm.validateAndSave (package:playground/main.dart:33:13)

我尝试在项目上运行flutter clean并重新运行应用程序。我仍然收到错误消息。

这是我正在运行的代码。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Playground',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(body:LoginForm()
      ),
    );
  }
}

class LoginForm extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _LoginForm();
}

class _LoginForm extends State<LoginForm>{
  // GlobalKey<FormState> formKey = new GlobalKey();
  final _formKey = new GlobalKey<FormState>();
  String _email;
  String _password;

  void validateAndSave(){
    final form = _formKey.currentState;
    if(form.validate())
    {
      print ('Form is valid');
    }
    else
    {
      print('form is invalid');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Container(
        padding: EdgeInsets.only(left: 15.0, right: 15.0),
        child: Form(
            child: Column(
              // mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: <Widget>[
                  SizedBox(height: 150.0,),
                  //input field for email
                  TextFormField(
                    decoration: InputDecoration(labelText: 'Email'),
                    validator: (value) => value.isEmpty ? 'Email cannot be blank':null,
                    //       onSaved: (value) => _email = value,
                  ),
                  //input field for password
                  TextFormField(
                    decoration: InputDecoration(labelText: 'Password'),
                    obscureText: true,
                    validator: (value) => value.isEmpty ? 'Password cannot be blank':null,
                    //     onSaved: (value) => _password = value,
                  ),
                  RaisedButton(
                    child: Text ('Login', style: TextStyle(fontSize: 20.0),),
                    onPressed: validateAndSave,
                  )
                ]
            )
        )
    );
  }
}

我觉得我在代码中遗漏了一些东西。我很感激任何帮助整理这个问题。

flutter
1个回答
4
投票

你没有将密钥添加到表单,这段代码应该可行

class _LoginForm extends State<LoginForm>{
  // GlobalKey<FormState> formKey = new GlobalKey();
  final _formKey = new GlobalKey<FormState>();
  String _email;
  String _password;

  void validateAndSave(){
    final form = _formKey.currentState;
    if(form.validate())
    {
      print ('Form is valid');
    }
    else
    {
      print('form is invalid');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Container(
        padding: EdgeInsets.only(left: 15.0, right: 15.0),
        child: Form(
            key: _formKey,
            child: Column(
              // mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: <Widget>[
                  SizedBox(height: 150.0,),
                  //input field for email
                  TextFormField(
                    decoration: InputDecoration(labelText: 'Email'),
                    validator: (value) => value.isEmpty ? 'Email cannot be blank':null,
                    //       onSaved: (value) => _email = value,
                  ),
                  //input field for password
                  TextFormField(
                    decoration: InputDecoration(labelText: 'Password'),
                    obscureText: true,
                    validator: (value) => value.isEmpty ? 'Password cannot be blank':null,
                    //     onSaved: (value) => _password = value,
                  ),
                  RaisedButton(
                    child: Text ('Login', style: TextStyle(fontSize: 20.0),),
                    onPressed: validateAndSave,
                  )
                ]
            )
        )
    );
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.