我想在 Flutter 的 TextFormField 中实现密码显示/隐藏功能,但它不起作用。我通常使用这种方法来实现,但在这里不起作用。如何修复死代码错误?
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:ionicons/ionicons.dart';
import 'package:xray_classifier_tb/screens/splashScreen.dart';
import 'package:xray_classifier_tb/theme/TextStyles.dart';
import 'package:xray_classifier_tb/theme/colors.dart';
import 'package:xray_classifier_tb/widgets/appButtons.dart';
import 'package:xray_classifier_tb/widgets/textFormFields.dart';
class LoginApp extends StatefulWidget {
const LoginApp({super.key});
@override
State<LoginApp> createState() => _LoginAppState();
}
class _LoginAppState extends State<LoginApp> {
@override
Widget build(BuildContext context) {
bool isVisible = false;
TextEditingController emailController = TextEditingController();
TextEditingController passwordController = TextEditingController();
Size size = MediaQuery.of(context).size;
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
systemNavigationBarColor: backgroundColor,
systemNavigationBarIconBrightness: Brightness.dark));
return Scaffold(
appBar: AppBar(
backgroundColor: backgroundColor,
leading: Padding(
padding: const EdgeInsets.only(top: 15.0),
child: IconButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const splashScreen()));
},
icon: const Icon(
Ionicons.arrow_back,
color: iconColor,
)),
),
actions: []),
body: Container(
width: double.infinity,
height: double.infinity,
color: backgroundColor,
child: Stack(
alignment: Alignment.topCenter,
children: [
Column(mainAxisAlignment: MainAxisAlignment.center, children: [
Text(
'Tuberculosis Detection \nUsing Deep Learning',
style: titleStyle.copyWith(fontSize: size.width * 0.04),
textAlign: TextAlign.center,
),
SizedBox(
width: size.width * 0.4,
child: Image.asset('assets/images/lungs_magnifying.png')),
Text(
'Welcome',
style: titleStyle.copyWith(fontSize: size.width * 0.05),
),
SizedBox(
height: size.height * .02,
),
Container(
width: size.width * 0.7,
decoration: BoxDecoration(
color: txtfieldclr,
borderRadius: BorderRadius.circular(12),
),
child: Padding(
padding: const EdgeInsets.only(left: 6.0),
child: TextFormField(
controller: emailController,
decoration: const InputDecoration(
prefixIcon: Icon(
Ionicons.mail,
color: iconColor,
),
hintText: 'Email',
hintStyle:
TextStyle(color: Color.fromARGB(255, 59, 59, 59)),
border: InputBorder.none),
),
),
),
SizedBox(
height: size.height * 0.02,
),
Container(
width: size.width * 0.7,
decoration: BoxDecoration(
color: txtfieldclr,
borderRadius: BorderRadius.circular(12),
),
child: Padding(
padding: const EdgeInsets.only(left: 6.0),
child: TextFormField(
controller: passwordController,
decoration: InputDecoration(
suffixIcon: Padding(
padding: EdgeInsets.only(left: 12),
child: IconButton(
icon: Icon(
isVisible ? Ionicons.eye : Ionicons.eye_off),//this is where the issue is Ionicon.eye is dead code although it shouldn't be
onPressed: () {
setState(() {
isVisible = !isVisible;
});
},
color: iconColor,
),
),
prefixIcon: Icon(Ionicons.key, color: iconColor),
hintText: 'Password',
hintStyle:
TextStyle(color: Color.fromARGB(255, 59, 59, 59)),
border: InputBorder.none),
obscureText: !isVisible,
),
),
),
SizedBox(
height: size.height * .005,
),
forgotbtn(
onPressed: () {},
),
SizedBox(
height: size.height * .02,
),
primarybtn(
onPressed: () {},
txtBtn: 'login',
containerColor:
containerBtn,
ShadowColor: Color.fromARGB(255, 134, 175, 128),
btntxtStyle: btntxtStyle2),
]),
],
),
),
);
}
}
在下面的代码片段中,相同的代码可以正常工作
TextField(
controller: controllerPassword,
cursorHeight: 15,
style: TextStyle(height: 1),
obscureText: !isPasswordVisible,
decoration: InputDecoration(
suffixIcon: TextButton(
child: Padding(
padding: EdgeInsets.only(left: 12),
child: Icon(
isPasswordVisible
? FontAwesomeIcons.eye
: FontAwesomeIcons.eyeSlash,
color: emeraldGreen,
),
),
onPressed: () {
setState(() {
isPasswordVisible =
!isPasswordVisible;
});
},
),
label: const Text('Password'),
labelStyle: secondarytxt,
focusColor: purpleColor,
focusedBorder: const OutlineInputBorder(
borderSide: BorderSide(
width: 1, color: purpleColor)),
enabledBorder: const OutlineInputBorder(
borderRadius:
BorderRadius.all(Radius.circular(10)),
),
)),
我尝试了一些方法来修复它,但它不起作用,无论如何它都会显示死代码 这是一个逻辑错误,但我似乎不知道它在哪里
好吧,我们在开始了解flutter时都犯了一个常见的错误,当你需要更改呈现的UI中的某些内容时,你会调用
setState()
,这会直接使框架一次又一次地调用build方法来重建你的用户界面。
此时您意识到,您不应该在构建方法中声明 UI 控制变量。
就像你所做的:
@override
Widget build(BuildContext context) {
bool isVisible = false;
TextEditingController emailController = TextEditingController();
TextEditingController passwordController = TextEditingController();
}
每次
setState()
时,都会创建一个名为 isVisible
的新变量,其布尔值等于 false。
(
isVisible
始终为假)。
而不是这样做,您应该将这些变量移动为类成员:
class _LoginAppState extends State<LoginApp> {
bool isVisible = false;
TextEditingController emailController = TextEditingController();
TextEditingController passwordController = TextEditingController();
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
}