flutter - currentState.validate() 导致 Flutter App 崩溃
问题描述
我正在创建一个 Flutter 应用程序,当我导航到这个特定屏幕时出现问题。模拟器崩溃并显示一条消息:
NoSuchMethodError:在 null 接收器上调用了方法“验证”:null 尝试调用:验证()
我不明白为什么要调用 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,
),
),
),
),
),
],
),
],
),
),
),
),
),
);
}
}
解决方案
_submit()
表示执行此功能。你必须删除()
你可以复制粘贴下面运行完整代码
代码片段
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(),
);
}
}
推荐阅读
- azure-data-factory-2 - azure 数据流中是否有办法按多个类别取消数据透视?
- arduino - 在 Arduino 的 TTGO T-Display 上上传任何脚本时出错
- css - 覆盖的内联样式仍然适用
- android - Wi-Fi Aware (NAN) 的主首选项是否在某些设备上具有默认值?
- scala - 在 scala 中为 SQS 功能编写模拟
- html - Summernote onkeyup 功能替换特殊字符
- flutter - 错误:不能将参数类型“Context”分配给参数类型“BuildContext”?
- dataframe - 限制 spark.read pyspark 的分区数
- python - Python .exe 脚本在 Windows 中立即关闭
- http - Kotlin - WebView 不加载网页