【问题标题】:Password show/hide toggle deletes password TextField value (Flutter)密码显示/隐藏切换删除密码 TextField 值 (Flutter)
【发布时间】:2020-12-16 09:23:24
【问题描述】:

当我点击显示/隐藏切换时,密码和用户名文本字段值都会被删除。我知道,当 setState 重建小部件树时,它将密码/用户名文本字段值重置为初始空白值。我知道我可以获取文本字段的值,但是我无法实现逻辑,如何首先获取当前用户名和密码值,将其保存在某处,然后在小部件与 setState 一起重建时将其插入回。

import 'package:flutter/material.dart';

class LoginScreen extends StatefulWidget {
  @override
  _LoginScreenState createState() => _LoginScreenState();
}

class _LoginScreenState extends State<LoginScreen> {
  bool _showPassword = true;

  @override
  Widget build(BuildContext context) {
    final usernameController = TextEditingController();
    final passwordController = TextEditingController();
    return SafeArea(
      child: Scaffold(
        body: Container(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: [
              Image(image: AssetImage('images/logo.png')),
              Padding(
                padding: const EdgeInsets.all(16.0),
                child: Column(
                  children: [
                    TextField(
                      controller: usernameController,
                      decoration: InputDecoration(
                        hintText: "Enter Username",
                        labelText: "UserName",
                      ),
                    ),
                    SizedBox(
                      height: 20.0,
                    ),
                    TextField(
                      obscureText: _showPassword,
                      controller: passwordController,
                      decoration: InputDecoration(
                        hintText: "Enter Password",
                        labelText: "Password",
                        suffixIcon: GestureDetector(
                          onTap: _togglePasswordVisibility,
                          child: _showPassword
                              ? Icon(Icons.visibility)
                              : Icon(Icons.visibility_off),
                        ),
                      ),
                    ),
                    SizedBox(
                      height: 20.0,
                    ),
                    RaisedButton(
                      onPressed: () {
                        //call api here to authenticate user
                      },
                      child: Text("Login"),
                    ),
                  ],
                ),
              ),
              Column(
                children: [
                  Text("Don't have an account! Get it in 2 easy steps"),
                  RaisedButton(
                    onPressed: () {
                      //take user to registration screen
                    },
                    child: Text("Register"),
                  ),
                ],
              ),
            ],
          ),
        ),
      ),
    );
  }

  void _togglePasswordVisibility() {
    setState(() {
      _showPassword = !_showPassword;
    });
  }
}

【问题讨论】:

    标签: flutter textfield setstate


    【解决方案1】:

    当您使用 setState 切换可见性时,将调用 build 方法来重绘该小部件。由于您在构建方法中初始化 TextEditingController,因此它会再次初始化并丢失先前的值。要解决此问题,您只需将初始化从构建方法删除到类级别。

    class _LoginScreenState extends State<LoginScreen> {
      bool _showPassword = true;
      final usernameController = TextEditingController();
      final passwordController = TextEditingController();
    
      @override
      Widget build(BuildContext context) {
        
        return SafeArea(
            //... Your code
        );
      }
      //... Your code
    }
    

    【讨论】:

    • 我觉得需要加上dispose()
    • @someuser 是的,他需要实现 dispose 方法,因为他还需要 dispose 文本编辑控制器
    • @MidhunMP 这行得通!我知道构建是如何被重绘的,但是以一种愚蠢的方式根本无法弄清楚我可以将这两个变量从构建中取出。菜鸟等级 100%。
    • @MidhunMP 为什么我需要实现 dispose() 并将控制器放入其中?这样控制器变量占用的内存位置资源就可以释放了?
    • @PriyankSharma 是的,用于释放分配的资源
    猜你喜欢
    • 2022-10-24
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 2020-12-29
    • 2021-08-25
    • 2015-12-26
    • 2017-09-09
    相关资源
    最近更新 更多