如何修复flutter中的DeadCode

问题描述 投票:0回答:1

我想在 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 dart flutter-dependencies
1个回答
0
投票

好吧,我们在开始了解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;

}
© www.soinside.com 2019 - 2024. All rights reserved.