Flutter 颤振误差:方法';验证';在null上调用了。接收方:null尝试调用:validate()

Flutter 颤振误差:方法';验证';在null上调用了。接收方:null尝试调用:validate(),flutter,dart,Flutter,Dart,我目前正在从事一个颤振项目。我在底部制作了一个平面按钮,并将函数\u submit()作为onPressed方法。但似乎\u formKey.currentState.validate()有错误。错误消息如下所示 对null调用了方法“validate”。 收件人:空 尝试调用:validate() 我发现了与我类似的问题,并试图解决它。但是我找不到我的错误 import 'package:flutter/material.dart'; import 'package:intl/intl.dar

我目前正在从事一个颤振项目。我在底部制作了一个平面按钮,并将函数\u submit()作为onPressed方法。但似乎\u formKey.currentState.validate()有错误。错误消息如下所示

对null调用了方法“validate”。 收件人:空 尝试调用:validate()

我发现了与我类似的问题,并试图解决它。但是我找不到我的错误

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';

class AddTaskScreen extends StatefulWidget {
  AddTaskScreen({Key key}) : super(key: key);

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

class _AddTaskScreenState extends State<AddTaskScreen> {
  final _formKey = GlobalKey<FormState>();
  String _title = '';
  String _priority;
  DateTime _date = DateTime.now();
  TextEditingController _dateController = TextEditingController();

  final DateFormat _dateFormatter = DateFormat('MMM dd, yyy');
  final List<String> _priorities = ['Low', 'Medium', 'High'];

  _handleDatePicker() async {
    final DateTime date = await showDatePicker(
        context: context,
        initialDate: _date,
        firstDate: DateTime(2000),
        lastDate: DateTime(2100));
    if (date != null && date != _date) {
      setState(() {
        _date = date;
      });
      _dateController.text = _dateFormatter.format(date);
    }
  }

  _submit() {
    if (_formKey.currentState.validate()) {
      _formKey.currentState.save();
      print('$_title $_date $_priority');
      Navigator.pop(context);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: GestureDetector(
        onTap: () => FocusScope.of(context).unfocus(),
        child: SingleChildScrollView(
          child: Container(
            padding: EdgeInsets.symmetric(horizontal: 40.0, vertical: 80.0),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                GestureDetector(
                  onTap: () => Navigator.pop(context),
                  child: Icon(
                    Icons.arrow_back_ios,
                    size: 30.0,
                    color: Colors.black,
                  ),
                ),
                SizedBox(
                  height: 20.0,
                ),
                Text('Add Task',
                    style: TextStyle(
                        color: Colors.black,
                        fontSize: 40.0,
                        fontWeight: FontWeight.bold)),
                SizedBox(height: 10.0),
                Form(
                  key: _formKey,
                  child: Column(
                    children: <Widget>[
                      Padding(
                        padding: EdgeInsets.symmetric(vertical: 20.0),
                        child: TextFormField(
                            style: TextStyle(fontSize: 18.0),
                            decoration: InputDecoration(
                                labelText: 'Title',
                                labelStyle: TextStyle(fontSize: 18.0),
                                border: OutlineInputBorder(
                                    borderRadius: BorderRadius.circular(10.0))),
                            validator: (input) => input.trim().isEmpty
                                ? 'Please enter a task title'
                                : null,
                            onSaved: (input) => _title = input,
                            initialValue: _title),
                      ),
                      Padding(
                          padding: EdgeInsets.symmetric(vertical: 20.0),
                          child: TextFormField(
                            readOnly: true,
                            controller: _dateController,
                            style: TextStyle(fontSize: 18.0),
                            onTap: _handleDatePicker,
                            decoration: InputDecoration(
                                labelText: 'Date',
                                labelStyle: TextStyle(fontSize: 18.0),
                                border: OutlineInputBorder(
                                    borderRadius: BorderRadius.circular(10.0))),
                          )),
                      Padding(
                          padding: EdgeInsets.symmetric(vertical: 20.0),
                          child: DropdownButtonFormField(
                            icon: Icon(Icons.arrow_drop_down_circle),
                            iconSize: 22.0,
                            items: _priorities.map((String priority) {
                              return DropdownMenuItem(
                                value: priority,
                                child: Text(
                                  priority,
                                  style: TextStyle(
                                      color: Colors.black, fontSize: 18.0),
                                ),
                              );
                            }).toList(),
                            style: TextStyle(fontSize: 18.0),
                            decoration: InputDecoration(
                                labelText: 'Priority',
                                labelStyle: TextStyle(fontSize: 18.0),
                                border: OutlineInputBorder(
                                    borderRadius: BorderRadius.circular(10.0))),
                            validator: (input) => _priority == null
                                ? 'Please select a priority level'
                                : null,
                            onChanged: (value) {
                              setState(() {
                                _priority = value;
                              });
                            },
                            value: _priority,
                          )),
                      Container(
                        margin: EdgeInsets.symmetric(vertical: 20.0),
                        height: 60.0,
                        width: double.infinity,
                        decoration: BoxDecoration(
                            color: Colors.black,
                            borderRadius: BorderRadius.circular(30.0)),
                        child: FlatButton(
                            onPressed: _submit(),
                            child: Text(
                              'Add',
                              style: TextStyle(
                                  color: Colors.white, fontSize: 20.0),
                            )),
                      )
                    ],
                  ),
                )
              ],
            ),
          ),
        ),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“包:intl/intl.dart”;
类AddTaskScreen扩展StatefulWidget{
AddTaskScreen({Key}):超级(Key:Key);
@凌驾
_AddTaskScreenState createState()=>\u AddTaskScreenState();
}
类_AddTaskScreenState扩展状态{
final _formKey=GlobalKey();
字符串_title='';
字符串优先级;
DateTime _date=DateTime.now();
TextEditingController _dateController=TextEditingController();
最终日期格式_dateFormatter=DateFormat('MMM dd,yyy');
最终列表_优先级=[‘低’、‘中’、‘高’];
_handleDatePicker()异步{
最终日期时间日期=等待showDatePicker(
上下文:上下文,
初始日期:_日期,
firstDate:DateTime(2000年),
lastDate:DateTime(2100));
如果(日期!=null&&date!=u日期){
设置状态(){
_日期=日期;
});
_dateController.text=\u dateFormatter.format(日期);
}
}
_提交(){
if(_formKey.currentState.validate()){
_formKey.currentState.save();
打印(“$”标题$”日期$”优先级“);
Navigator.pop(上下文);
}
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:手势检测器(
onTap:()=>FocusScope.of(context.unfocus(),
子:SingleChildScrollView(
子:容器(
填充:边缘组。对称(水平:40.0,垂直:80.0),
子:列(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
手势检测器(
onTap:()=>Navigator.pop(上下文),
子:图标(
Icons.arrow\u back\u ios,
尺寸:30.0,
颜色:颜色,黑色,
),
),
大小盒子(
身高:20.0,
),
文本('添加任务',
样式:TextStyle(
颜色:颜色,黑色,
字体大小:40.0,
fontWeight:fontWeight.bold),
尺寸箱(高度:10.0),
形式(
键:_formKey,
子:列(
儿童:[
填充物(
填充:边缘组。对称(垂直:20.0),
子项:TextFormField(
样式:TextStyle(fontSize:18.0),
装饰:输入装饰(
labelText:“标题”,
标签样式:文本样式(字体大小:18.0),
边框:大纲输入边框(
边界半径:边界半径。圆形(10.0)),
验证器:(输入)=>input.trim().isEmpty
?“请输入任务标题”
:null,
onSaved:(输入)=>\u title=输入,
初始值:_title),
),
填充物(
填充:边缘组。对称(垂直:20.0),
子项:TextFormField(
只读:对,
控制器:_dateController,
样式:TextStyle(fontSize:18.0),
onTap:_handleDatePicker,
装饰:输入装饰(
labelText:'日期',
标签样式:文本样式(字体大小:18.0),
边框:大纲输入边框(
边界半径:边界半径。圆形(10.0)),
)),
填充物(
填充:边缘组。对称(垂直:20.0),
子项:DropdownButtonFormField(
图标:图标(图标。箭头\下拉\圆圈),
iconSize:22.0,
项目:_priorities.map((字符串优先级){
返回下拉菜单项(
价值:优先权,
子:文本(
优先,
样式:TextStyle(
颜色:颜色。黑色,字体大小:18.0),
),
);
}).toList(),
样式:TextStyle(fontSize:18.0),
装饰:输入装饰(
labelText:“优先级”,
标签样式:文本样式(字体大小:18.0),
边框:大纲输入边框(
边界半径:边界半径。圆形(10.0)),
验证程序:(输入)=>\u优先级==null
?“请选择优先级”
:null,
一旦更改:(值){
设置状态(){
_优先级=价值;
});
},
值:_优先级,
FlatButton(
          onPressed: _submit(),
FlatButton(
          onPressed: _submit,
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';

class AddTaskScreen extends StatefulWidget {
  AddTaskScreen({Key key}) : super(key: key);

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

class _AddTaskScreenState extends State<AddTaskScreen> {
  final _formKey = GlobalKey<FormState>();
  String _title = '';
  String _priority;
  DateTime _date = DateTime.now();
  TextEditingController _dateController = TextEditingController();

  final DateFormat _dateFormatter = DateFormat('MMM dd, yyy');
  final List<String> _priorities = ['Low', 'Medium', 'High'];

  _handleDatePicker() async {
    final DateTime date = await showDatePicker(
        context: context,
        initialDate: _date,
        firstDate: DateTime(2000),
        lastDate: DateTime(2100));
    if (date != null && date != _date) {
      setState(() {
        _date = date;
      });
      _dateController.text = _dateFormatter.format(date);
    }
  }

  _submit() {
    if (_formKey.currentState.validate()) {
      _formKey.currentState.save();
      print('$_title $_date $_priority');
      Navigator.pop(context);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: GestureDetector(
        onTap: () => FocusScope.of(context).unfocus(),
        child: SingleChildScrollView(
          child: Container(
            padding: EdgeInsets.symmetric(horizontal: 40.0, vertical: 80.0),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                GestureDetector(
                  onTap: () => Navigator.pop(context),
                  child: Icon(
                    Icons.arrow_back_ios,
                    size: 30.0,
                    color: Colors.black,
                  ),
                ),
                SizedBox(
                  height: 20.0,
                ),
                Text('Add Task',
                    style: TextStyle(
                        color: Colors.black,
                        fontSize: 40.0,
                        fontWeight: FontWeight.bold)),
                SizedBox(height: 10.0),
                Form(
                  key: _formKey,
                  child: Column(
                    children: <Widget>[
                      Padding(
                        padding: EdgeInsets.symmetric(vertical: 20.0),
                        child: TextFormField(
                            style: TextStyle(fontSize: 18.0),
                            decoration: InputDecoration(
                                labelText: 'Title',
                                labelStyle: TextStyle(fontSize: 18.0),
                                border: OutlineInputBorder(
                                    borderRadius: BorderRadius.circular(10.0))),
                            validator: (input) => input.trim().isEmpty
                                ? 'Please enter a task title'
                                : null,
                            onSaved: (input) => _title = input,
                            initialValue: _title),
                      ),
                      Padding(
                          padding: EdgeInsets.symmetric(vertical: 20.0),
                          child: TextFormField(
                            readOnly: true,
                            controller: _dateController,
                            style: TextStyle(fontSize: 18.0),
                            onTap: _handleDatePicker,
                            decoration: InputDecoration(
                                labelText: 'Date',
                                labelStyle: TextStyle(fontSize: 18.0),
                                border: OutlineInputBorder(
                                    borderRadius: BorderRadius.circular(10.0))),
                          )),
                      Padding(
                          padding: EdgeInsets.symmetric(vertical: 20.0),
                          child: DropdownButtonFormField(
                            icon: Icon(Icons.arrow_drop_down_circle),
                            iconSize: 22.0,
                            items: _priorities.map((String priority) {
                              return DropdownMenuItem(
                                value: priority,
                                child: Text(
                                  priority,
                                  style: TextStyle(
                                      color: Colors.black, fontSize: 18.0),
                                ),
                              );
                            }).toList(),
                            style: TextStyle(fontSize: 18.0),
                            decoration: InputDecoration(
                                labelText: 'Priority',
                                labelStyle: TextStyle(fontSize: 18.0),
                                border: OutlineInputBorder(
                                    borderRadius: BorderRadius.circular(10.0))),
                            validator: (input) => _priority == null
                                ? 'Please select a priority level'
                                : null,
                            onChanged: (value) {
                              setState(() {
                                _priority = value;
                              });
                            },
                            value: _priority,
                          )),
                      Container(
                        margin: EdgeInsets.symmetric(vertical: 20.0),
                        height: 60.0,
                        width: double.infinity,
                        decoration: BoxDecoration(
                            color: Colors.black,
                            borderRadius: BorderRadius.circular(30.0)),
                        child: FlatButton(
                            onPressed: _submit,
                            child: Text(
                              'Add',
                              style: TextStyle(
                                  color: Colors.white, fontSize: 20.0),
                            )),
                      )
                    ],
                  ),
                )
              ],
            ),
          ),
        ),
      ),
    );
  }
}

void main() {
  runApp(MyApp());
}

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