【问题标题】:currentState.validate() Causing Flutter App to CrashcurrentState.validate() 导致 Flutter 应用崩溃
【发布时间】:2019-12-10 17:56:28
【问题描述】:

我正在创建一个 Flutter 应用程序,当我导航到这个特定屏幕时出现问题。模拟器崩溃并显示一条消息:

NoSuchMethodError:在 null 上调用了方法“validate” 接收方:空 尝试调用:validate()

我不明白为什么要调用 validate() 方法,即使它包含在 _submit 函数中,该函数仅在按下屏幕中的按钮时才会调用。当我从 onPressed 中删除函数调用时:应用程序正常工作。

import 'package:flutter/material.dart';
import 'package:service_request/services/auth_services.dart';
import 'package:flutter/services.dart';

class SignupForm extends StatefulWidget {
  static const String id = 'signup_screen';

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

class _SignupFormState extends State<SignupForm> {
  final _signUpFormKey = GlobalKey<FormState>();
  String _name, _email, _password;

  _submit() {
    if (_signUpFormKey.currentState.validate()) {
      _signUpFormKey.currentState.save();
      // Logging in the user w/ Firebase
      AuthService.signUpUser(context, _name, _email, _password);
    }
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        appBar: AppBar(
          title: Text('Sign Up'),
        ),
        body: SingleChildScrollView(
          child: Form(
            key: _signUpFormKey,
            child: Padding(
              padding: EdgeInsets.all(20.0),
              child: Column(
                children: <Widget>[
                  Padding(
                    padding: EdgeInsets.symmetric(vertical: 10.0),
                    child: TextFormField(
                      decoration: InputDecoration(
                        border: OutlineInputBorder(
                          borderSide: BorderSide(
                            color: Colors.black54,
                          ),
                        ),
                        labelText: 'Name',
                      ),
                      validator: (input) => input.trim().isEmpty
                          ? 'Please enter a valid name'
                          : null,
                      onSaved: (input) => _name = input,
                    ),
                  ),
                  Padding(
                    padding: EdgeInsets.symmetric(vertical: 10.0),
                    child: TextFormField(
                      keyboardType: TextInputType.emailAddress,
                      validator: (input) => !input.contains('@')
                          ? 'Please enter a valid email'
                          : null,
                      onSaved: (input) => _email = input,
                      decoration: InputDecoration(
                        border: OutlineInputBorder(
                          borderSide: BorderSide(
                            color: Colors.black54,
                          ),
                        ),
                        labelText: 'Email Address',
                      ),
                    ),
                  ),
                  Padding(
                    padding: EdgeInsets.symmetric(vertical: 10.0),
                    child: TextFormField(
                      validator: (input) => input.length < 6
                          ? 'Must be at least 6 characters'
                          : null,
                      onSaved: (input) => _password = input,
                      obscureText: true,
                      decoration: InputDecoration(
                        border: OutlineInputBorder(
                          borderSide: BorderSide(
                            color: Colors.black54,
                          ),
                        ),
                        labelText: 'Password',
                      ),
                    ),
                  ),
                  Column(
                    children: <Widget>[
                      Padding(
                        padding: EdgeInsets.symmetric(vertical: 10.0),
                        child: Container(
                          decoration: BoxDecoration(
                            color: Colors.blue,
                            borderRadius: BorderRadius.circular(10.0),
                          ),
                          width: 350.0,
                          child: FlatButton(
                            onPressed: null,
                            child: Text(
                              'Sign Up',
                              style: TextStyle(
                                color: Colors.white,
                                fontSize: 18.0,
                              ),
                            ),
                          ),
                        ),
                      ),
                      Padding(
                        padding: EdgeInsets.symmetric(vertical: 10.0),
                        child: Container(
                          decoration: BoxDecoration(
                            color: Colors.red,
                            borderRadius: BorderRadius.circular(10.0),
                          ),
                          width: 350.0,
                          child: FlatButton(
                            onPressed: _submit(),
                            child: Text(
                              'Back to Log In',
                              style: TextStyle(
                                color: Colors.white,
                                fontSize: 18.0,
                              ),
                            ),
                          ),
                        ),
                      ),
                    ],
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    _submit() 表示执行此函数。你必须删除()
    您可以在下面复制粘贴运行完整代码

    代码sn-p

    FlatButton(
                                onPressed: _submit,
                                child: Text(
                                  'Back to Log In',
                                  style: TextStyle(
                                    color: Colors.white,
                                    fontSize: 18.0,
                                  ),
                                ),
                              )
    

    工作演示

    完整代码

    import 'package:flutter/material.dart';
    import 'package:flutter/services.dart';
    
    import 'package:flutter/services.dart';
    
    class SignupForm extends StatefulWidget {
      static const String id = 'signup_screen';
    
      @override
      _SignupFormState createState() => _SignupFormState();
    }
    
    class _SignupFormState extends State<SignupForm> {
      final _signUpFormKey = GlobalKey<FormState>();
      String _name, _email, _password;
    
      _submit() {
        if (_signUpFormKey.currentState.validate()) {
          _signUpFormKey.currentState.save();
          // Logging in the user w/ Firebase
          //AuthService.signUpUser(context, _name, _email, _password);
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return SafeArea(
          child: Scaffold(
            appBar: AppBar(
              title: Text('Sign Up'),
            ),
            body: SingleChildScrollView(
              child: Form(
                key: _signUpFormKey,
                child: Padding(
                  padding: EdgeInsets.all(20.0),
                  child: Column(
                    children: <Widget>[
                      Padding(
                        padding: EdgeInsets.symmetric(vertical: 10.0),
                        child: TextFormField(
                          decoration: InputDecoration(
                            border: OutlineInputBorder(
                              borderSide: BorderSide(
                                color: Colors.black54,
                              ),
                            ),
                            labelText: 'Name',
                          ),
                          validator: (input) => input.trim().isEmpty
                              ? 'Please enter a valid name'
                              : null,
                          onSaved: (input) => _name = input,
                        ),
                      ),
                      Padding(
                        padding: EdgeInsets.symmetric(vertical: 10.0),
                        child: TextFormField(
                          keyboardType: TextInputType.emailAddress,
                          validator: (input) => !input.contains('@')
                              ? 'Please enter a valid email'
                              : null,
                          onSaved: (input) => _email = input,
                          decoration: InputDecoration(
                            border: OutlineInputBorder(
                              borderSide: BorderSide(
                                color: Colors.black54,
                              ),
                            ),
                            labelText: 'Email Address',
                          ),
                        ),
                      ),
                      Padding(
                        padding: EdgeInsets.symmetric(vertical: 10.0),
                        child: TextFormField(
                          validator: (input) => input.length < 6
                              ? 'Must be at least 6 characters'
                              : null,
                          onSaved: (input) => _password = input,
                          obscureText: true,
                          decoration: InputDecoration(
                            border: OutlineInputBorder(
                              borderSide: BorderSide(
                                color: Colors.black54,
                              ),
                            ),
                            labelText: 'Password',
                          ),
                        ),
                      ),
                      Column(
                        children: <Widget>[
                          Padding(
                            padding: EdgeInsets.symmetric(vertical: 10.0),
                            child: Container(
                              decoration: BoxDecoration(
                                color: Colors.blue,
                                borderRadius: BorderRadius.circular(10.0),
                              ),
                              width: 350.0,
                              child: FlatButton(
                                onPressed: null,
                                child: Text(
                                  'Sign Up',
                                  style: TextStyle(
                                    color: Colors.white,
                                    fontSize: 18.0,
                                  ),
                                ),
                              ),
                            ),
                          ),
                          Padding(
                            padding: EdgeInsets.symmetric(vertical: 10.0),
                            child: Container(
                              decoration: BoxDecoration(
                                color: Colors.red,
                                borderRadius: BorderRadius.circular(10.0),
                              ),
                              width: 350.0,
                              child: FlatButton(
                                onPressed: _submit,
                                child: Text(
                                  'Back to Log In',
                                  style: TextStyle(
                                    color: Colors.white,
                                    fontSize: 18.0,
                                  ),
                                ),
                              ),
                            ),
                          ),
                        ],
                      ),
                    ],
                  ),
                ),
              ),
            ),
          ),
        );
      }
    }
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(        
            primarySwatch: Colors.blue,
          ),
          home: SignupForm(),
        );
      }
    }
    

    【讨论】:

    • 感谢您的回复,非常感谢。
    【解决方案2】:

    您正在调用方法而不是设置回调。编译器通常会选择它,但您的方法没有输入。 Dart 中的无类型方法返回一个动态对象,它可能是一个函数,这就是为什么你可以从你的小部件中调用它的原因。应该通过将其更改为 onPressed: _submitonPressed: () =&gt; _submit() 来修复它,因为它们是函数而不是方法调用。

    【讨论】:

    • 我知道它必须是一些简单的东西,浪费了太多时间试图弄明白。感谢您的回复,非常感谢。
    猜你喜欢
    • 2022-01-21
    • 2020-07-26
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    相关资源
    最近更新 更多