Flutter 颤振误差:方法';验证';在null上调用了。接收方:null尝试调用:validate()
我目前正在从事一个颤振项目。我在底部制作了一个平面按钮,并将函数\u submit()作为onPressed方法。但似乎\u formKey.currentState.validate()有错误。错误消息如下所示 对null调用了方法“validate”。 收件人:空 尝试调用: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
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(),
);
}
}