一个文本字段工作正常,另一个文本字段无法正常工作



我有两个几乎相同的TextField小部件。它们是:

class EmailField extends StatelessWidget {
const EmailField(this.width, this.height, this.controller, {Key key})
: super(key: key);
final double width;
final double height;
final TextEditingController controller;
@override
Widget build(BuildContext context) {
return Positioned(
top: 60 * height / 100,
left: width / 15,
width: width,
child: Container(
margin: EdgeInsets.fromLTRB(width / 5, 0, width / 5, 0),
child: TextField(
controller: controller,
style: TextStyle(color: Colors.white, fontSize: 25),
keyboardType: TextInputType.emailAddress,
decoration: InputDecoration(
hintText: 'email',
hintStyle: TextStyle(color: Colors.white70, fontSize: 25),
border: InputBorder.none,
isDense: true,
),
),
),
);
}
}

class PasswordField extends StatelessWidget {
const PasswordField(this.width, this.height, this.controller, {Key key})
: super(key: key);
final double width;
final double height;
final TextEditingController controller;
@override
Widget build(BuildContext context) {
return Positioned(
top: 60 * height / 100 + 100,
left: width / 15,
width: width,
child: Container(
margin: EdgeInsets.fromLTRB(width / 5, 0, width / 5, 0),
child: TextField(
controller: controller,
style: TextStyle(color: Colors.white, fontSize: 25),
decoration: InputDecoration(
hintText: 'şifre',
hintStyle: TextStyle(color: Colors.white70, fontSize: 25),
border: InputBorder.none,
isDense: true,
),
obscureText: true,
),
),
);
}
}

这就是我处理控制器的方式,然后我将它们作为参数传递:

class _AuthState extends State<Auth> {
final emailController = TextEditingController();
final passwordController = TextEditingController();
bool isSignIn = true;
String _email;
String _password;
@override
void initState() {
super.initState();
emailController.addListener(
() => _email = emailController.text,
);
emailController.addListener(
() => _password = passwordController.text,
);
}
@override
void dispose() {
super.dispose();
emailController.dispose();
passwordController.dispose();
}

问题是电子邮件工作正常,密码总是空的。

但是,如果我在密码中输入了一些文本的情况下编辑电子邮件,它会更新并正常工作。

这怎么可能呢,它们几乎是一样的东西?

我就是这么称呼他们的

@override
Widget build(BuildContext context) {
final double width = MediaQuery.of(context).size.width;
final double height = MediaQuery.of(context).size.height;
return Scaffold(
body: SingleChildScrollView(
child: Builder(
builder: (context) => Container(
height: height,
width: width,
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topRight,
end: Alignment.bottomLeft,
colors: [
Color.fromRGBO(28, 18, 18, 1),
Color.fromRGBO(138, 135, 135, 1),
],
),
),
child: Stack(
children: [
EmailField(width, height, emailController),
PasswordField(width, height, passwordController),

检查_AuthState中的addListener,它们都与emailController 有关

所以改变这个

@override
void initState() {
super.initState();
emailController.addListener(
() => _email = emailController.text,
);
emailController.addListener(
() => _password = passwordController.text,
);
}

到这个

@override
void initState() {
super.initState();
emailController.addListener(
() => _email = emailController.text,
);
passwordController.addListener(
() => _password = passwordController.text,
);
}

最新更新