TextFormField小部件上的onSaved事件处理程序不起作用。
onSaved: (String value) {
setState(() {
_strNameUser = value;
});
},
如果我理解正确,字符串值是出现在输入字段中的文本值。然后,我可以将它分配给任何变量。但什么也没有发生。一切都发生在控制器中。第一个代码没有控制器,它不起作用。第二个代码是一个替换onSaved的控制器。那里的代码有效。我不明白的原因是什么?
第一个代码没有控制器,它不起作用。
主要.dart
import 'package:flutter/material.dart';
import 'package:string_validator/string_validator.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Name App',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: Text('Name Page'),
),
body: MyHomePage(),
),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
//объявление переменных
String _strNameUser;
String _strEmail;
String _str;
bool _a, _b, _c;
//вызывается один раз при инициализации виджета
@override
void initState() {
super.initState();
_strNameUser = '';
_strEmail = '';
_str = '';
}
@override
void dispose() {
super.dispose();
}
void _f1() {
setState(() {
_a = _strNameUser.isNotEmpty;
_b = _strEmail.isNotEmpty;
_c = isEmail(_strEmail);
if(_a && _b && _c) {
_str = 'user name : $_strNameUser\n email: $_strEmail';
} else {
_str = '';
}
});
}
@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
Align(
alignment: Alignment(0.0, -0.65),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Container(
height: 50.0,
margin: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
alignment: Alignment.center,
child: TextFormField(
onSaved: (String value) {
setState(() {
_strNameUser = value;
});
},
cursorColor: Color(0xffF56323),
style: TextStyle(
color: Colors.deepPurple,
fontSize: 22.0,
),
decoration: InputDecoration(
labelText: 'User Name',
prefixIcon: (_a == null || _a) ? Icon(Icons.person, color: Color(0xffF56323)) : Icon(Icons.error, color: Colors.pink),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10.0),
borderSide: BorderSide(),
),
),
),
),
Container(
height: 50.0,
margin: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
alignment: Alignment.center,
child: TextFormField(
onSaved: (String value) {
setState(() {
_strEmail = value;
});
},
keyboardType: TextInputType.emailAddress,
cursorColor: Color(0xffF56323),
style: TextStyle(
color: Colors.deepPurple,
fontSize: 22.0,
),
decoration: InputDecoration(
labelText: 'Email',
prefixIcon: (_b == null || (_b && _c)) ? Icon(Icons.email, color: Color(0xffF56323)) : Icon(Icons.error, color: Colors.pink),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10.0),
borderSide: BorderSide()
),
),
),
),
Container(
height: 50.0,
margin: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
alignment: Alignment.center,
child: Container(
width: double.infinity,
height: 50.0,
child: FlatButton(
onPressed: () {
_f1();
},
color: Color(0xffF56323).withOpacity(0.9),
splashColor: Colors.amberAccent,
child: Text(
'Ok',
style: TextStyle(
color: Colors.white,
fontSize: 22.0,
),
),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10)
),
),
),
),
],
),
),
Align(
alignment: Alignment(0.0, 0.85),
child: Text(
_str,
style: TextStyle(
color: Colors.pink,
fontSize: 26.0,
),
),
),
],
);
}
}
控制器的第二个代码有效。
主要.dart
import 'package:flutter/material.dart';
import 'package:string_validator/string_validator.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Name App',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: Text('Name Page'),
),
body: MyHomePage(),
),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
//объявление переменных
TextEditingController _controllerUserName;
TextEditingController _controllerEmail;
String _strNameUser;
String _strEmail;
String _str;
bool _a, _b, _c;
//вызывается один раз при инициализации виджета
@override
void initState() {
super.initState();
_controllerUserName = TextEditingController();
_controllerEmail = TextEditingController();
_strNameUser = '';
_strEmail = '';
_str = '';
}
@override
void dispose() {
super.dispose();
}
void _f1() {
setState(() {
_strNameUser = _controllerUserName.text;
_strEmail = _controllerEmail.text;
_a = _strNameUser.isNotEmpty;
_b = _strEmail.isNotEmpty;
_c = isEmail(_strEmail);
if(_a && _b && _c) {
_str = 'user name : $_strNameUser\n email: $_strEmail';
} else {
_str = '';
}
});
}
@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
Align(
alignment: Alignment(0.0, -0.65),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Container(
height: 50.0,
margin: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
alignment: Alignment.center,
child: TextFormField(
controller: _controllerUserName,
cursorColor: Color(0xffF56323),
style: TextStyle(
color: Colors.deepPurple,
fontSize: 22.0,
),
decoration: InputDecoration(
labelText: 'User Name',
prefixIcon: (_a == null || _a) ? Icon(Icons.person, color: Color(0xffF56323)) : Icon(Icons.error, color: Colors.pink),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10.0),
borderSide: BorderSide(),
),
),
),
),
Container(
height: 50.0,
margin: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
alignment: Alignment.center,
child: TextFormField(
controller: _controllerEmail,
keyboardType: TextInputType.emailAddress,
cursorColor: Color(0xffF56323),
style: TextStyle(
color: Colors.deepPurple,
fontSize: 22.0,
),
decoration: InputDecoration(
labelText: 'Email',
prefixIcon: (_b == null || (_b && _c)) ? Icon(Icons.email, color: Color(0xffF56323)) : Icon(Icons.error, color: Colors.pink),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10.0),
borderSide: BorderSide()
),
),
),
),
Container(
height: 50.0,
margin: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
alignment: Alignment.center,
child: Container(
width: double.infinity,
height: 50.0,
child: FlatButton(
onPressed: () {
_f1();
},
color: Color(0xffF56323).withOpacity(0.9),
splashColor: Colors.amberAccent,
child: Text(
'Ok',
style: TextStyle(
color: Colors.white,
fontSize: 22.0,
),
),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10)
),
),
),
),
],
),
),
Align(
alignment: Alignment(0.0, 0.85),
child: Text(
_str,
style: TextStyle(
color: Colors.pink,
fontSize: 26.0,
),
),
),
],
);
}
}
不幸的是,您误解了 onSaved 方法,它是在保存时调用附加代码所必需的,而 value 是用于发送到附加代码。
https://api.flutter.dev/flutter/material/TextFormField-class.html
您需要调用表单保存:
并且以牺牲控制器为代价,您正确理解,顾名思义,它控制/控制某些东西(在本例中
TextFormField)