【问题标题】:One TextField works properly the other doesn't一个 TextField 可以正常工作,而另一个不能
【发布时间】:2021-01-05 19:55:39
【问题描述】:

我有两个几乎相同的 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();
  }

问题是Email工作正常,密码总是为空。

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

这怎么可能,它们几乎是一回事?

我就是这么称呼他们的

@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),

【问题讨论】:

  • 如何构造PasswordFieldEmailField 实例?可以添加相关代码吗?
  • @Sphinx 更新

标签: flutter


【解决方案1】:

在 _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,
    );
  }

【讨论】:

  • 非常感谢。一小时寻找“错误”。花了很多钱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 2018-08-29
  • 2015-10-26
  • 2022-12-11
相关资源
最近更新 更多