Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何创建自定义TextField类?_Flutter_Dart - Fatal编程技术网

Flutter 如何创建自定义TextField类?

Flutter 如何创建自定义TextField类?,flutter,dart,Flutter,Dart,我正在尝试创建一个自定义textfield类,这样我就可以通过在一个地方编辑来轻松更改它的外观。目前,我面临一个如何使切换密码可见性的问题 这是我的自定义textfield类的内容: class CustomTextFieldOutline extends StatelessWidget { CustomTextFieldOutline( {this.label, this.controller, this.isValid, thi

我正在尝试创建一个自定义textfield类,这样我就可以通过在一个地方编辑来轻松更改它的外观。目前,我面临一个如何使切换密码可见性的问题

这是我的自定义textfield类的内容:

class CustomTextFieldOutline extends StatelessWidget {
  CustomTextFieldOutline(
      {this.label,
        this.controller,
        this.isValid,
        this.invalidMsg});

  final String label;
  final TextEditingController controller;
  final bool isValid;
  final String invalidMsg;

  @override
  Widget build(BuildContext context) {
    return TextField(
      decoration: InputDecoration(
          labelText: label,
          errorText: isValid ? null : invalidMsg,
          errorStyle: TextStyle(color: constant.colorWhite),
          labelStyle: TextStyle(color: constant.colorWhite),
          errorBorder: UnderlineInputBorder(
            borderSide: BorderSide(color: constant.colorWhite),
          ),
          focusedErrorBorder: UnderlineInputBorder(
            borderSide: BorderSide(color: constant.colorWhite),
          ),
          enabledBorder: UnderlineInputBorder(
            borderSide: BorderSide(color: constant.colorWhite),
          ),
          focusedBorder: UnderlineInputBorder(
            borderSide: BorderSide(color: constant.colorWhite),
          )),
      style: TextStyle(color: constant.colorWhite),
      controller: controller,
    );
  }
}
我这样称呼它:

final _resetPasswordView = Container(
  child: AnimatedOpacity(
    opacity: _resetPasswordVisibility ? 1.0 : 0.0,
    duration: Duration(milliseconds: 300),
    child: Column(
      crossAxisAlignment: CrossAxisAlignment.stretch,
      children: <Widget>[
        CustomTextFieldOutline(
          label: constant.email,
          controller: _emailSignInController,
          isValid: _isEmailValid,
          invalidMsg: _emailValidMsg,
        )
      ],
    ),
  ),
)
如何将密码文本字段功能合并到自定义类中,以便将其用于密码或电子邮件文本字段?

class CustomTextFieldOutline extends StatefulWidget{
class CustomTextFieldOutline extends StatefulWidget {
  const CustomTextFieldOutline(
      {Key key, this.hintText, this.label, this.onChange})
      : super(key: key);

  final String hintText;
  final String label;
  final void Function(String value) onChange;

  @override
  _CustomTextFieldOutlineState createState() => _CustomTextFieldOutlineState();
}

class _CustomTextFieldOutlineState extends State<CustomTextFieldOutline> {
  bool showPassword = false;
  TextEditingController controller = TextEditingController();

  void _onChange(String value) {
    controller.text = value;
    if (widget.onChange != null) {
      widget.onChange(value);
    }
  }

  void _changePwdType() {
    setState(() {
      showPassword = !showPassword;
    });
  }

  @override
  Widget build(BuildContext context) {
    return TextField(
      obscureText: showPassword,
      controller: controller,
      onChanged: (value) => _onChange,
      decoration: InputDecoration(
        suffixIcon: IconButton(
          icon: Icon(showPassword ? Icons.visibility : Icons.visibility_off),
          onPressed: _changePwdType,
        ),
        hintText: widget.hintText != null ? widget.hintText : null,
        labelText: widget.label != null ? widget.label : null,
      ),
    );
  }
}
常量CustomTextFieldOutline( {Key Key,this.hintText,this.label,this.onChange}) :super(key:key); 最终字符串hintText; 最终字符串标签; 更改后的最终无效函数(字符串值); @凌驾 _CustomTextFieldOutlineState createState()=>_CustomTextFieldOutlineState(); } 类_CustomTextFieldOutlineState扩展状态{ bool showPassword=false; TextEditingController=TextEditingController(); void\u onChange(字符串值){ controller.text=值; if(widget.onChange!=null){ widget.onChange(值); } } void _changePwdType(){ 设置状态(){ showPassword=!showPassword; }); } @凌驾 小部件构建(构建上下文){ 返回文本字段( 模糊文本:showPassword, 控制器:控制器, onChanged:(值)=>\u onChange, 装饰:输入装饰( 后缀:图标按钮( 图标:图标(显示密码?图标。可见性:图标。可见性关闭), 按下时:_changePwdType, ), hintText:widget.hintText!=null?widget.hintText:null, labelText:widget.label!=null?widget.label:null, ), ); } }
以下是来自

我确实喜欢这个

Widget customTextField(TextInputType textInputType) {
    RegExp pattern = RegExp(
        r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+");
    TextEditingController _textEditingController = TextEditingController();

    if (textInputType == TextInputType.visiblePassword) {
      return TextField(
        controller: _textEditingController,
        decoration: InputDecoration(hintText: 'Password'),
        keyboardType: TextInputType.visiblePassword,
        obscureText: true,
      );
    } else {
      return TextField(
        controller: _textEditingController,
        decoration: InputDecoration(hintText: 'Email'),
        keyboardType: TextInputType.emailAddress,
        inputFormatters: [BlacklistingTextInputFormatter(pattern)],
      );
    }
  }
@覆盖
小部件构建(构建上下文){
返回脚手架(
正文:安全区(
子:ListView(
收缩膜:对,
儿童:[
customTextField(TextInputType.visiblePassword),
customTextField(TextInputType.emailAddress),
],
),
),
);
}
idk如何为电子邮件创建RegExp,但结果如下:

class CustomTextField extends StatefulWidget {
  final String hint;
  final TextEditingController controller;
  final Color baseColor;
  final Color borderColor;
  final Color errorColor;
  final TextInputType inputType;
  final bool obscureText;
  final Function validator;
  final Function onChanged;

  CustomTextField(
      {this.hint,
      this.controller,
      this.onChanged,
      this.baseColor,
      this.borderColor,
      this.errorColor,
      this.inputType = TextInputType.text,
      this.obscureText = false,
      this.validator});

  _CustomTextFieldState createState() => _CustomTextFieldState();
}

class _CustomTextFieldState extends State<CustomTextField> {
  Color currentColor;

  @override
  void initState() {
    super.initState();
    currentColor = widget.borderColor;
  }

  @override
  Widget build(BuildContext context) {
    return Card(
      elevation: 0.0,
      color: Colors.white,
      shape: RoundedRectangleBorder(
        side: BorderSide(color: currentColor, width: 2.0),
        borderRadius: BorderRadius.circular(20.0),
      ),
      child: Padding(
        padding: EdgeInsets.symmetric(horizontal: 10.0),
        child: TextField(
          obscureText: widget.obscureText,
          onChanged: (text) {
            if (widget.onChanged != null) {
              widget.onChanged(text);
            }
            setState(() {
              if (!widget.validator(text) || text.length == 0) {
                currentColor = widget.errorColor;
              } else {
                currentColor = widget.baseColor;
              }
            });
          }, 
          //keyboardType: widget.inputType,
          controller: widget.controller,
          decoration: InputDecoration(
            hintStyle: TextStyle(
              color: widget.baseColor,
              fontFamily: "OpenSans",
              fontWeight: FontWeight.w300,
            ),
            border: InputBorder.none,
            hintText: widget.hint,
          ),
        ),
      ),
    );
  }
}
 _emailField = new CustomTextField(
      baseColor: Colors.grey,
      borderColor: Colors.grey[400],
      errorColor: Colors.red,
      controller: _email,
      hint: "E-mail Adress",
      inputType: TextInputType.emailAddress,
      validator: Validator.validateEmail,
    );
    _passwordField = CustomTextField(
      baseColor: Colors.grey,
      borderColor: Colors.grey[400],
      errorColor: Colors.red,
      controller: _password,
      obscureText: true,
      hint: "Password",
      validator: Validator.validatePassword,
);
Widget customTextField(TextInputType textInputType) {
    RegExp pattern = RegExp(
        r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+");
    TextEditingController _textEditingController = TextEditingController();

    if (textInputType == TextInputType.visiblePassword) {
      return TextField(
        controller: _textEditingController,
        decoration: InputDecoration(hintText: 'Password'),
        keyboardType: TextInputType.visiblePassword,
        obscureText: true,
      );
    } else {
      return TextField(
        controller: _textEditingController,
        decoration: InputDecoration(hintText: 'Email'),
        keyboardType: TextInputType.emailAddress,
        inputFormatters: [BlacklistingTextInputFormatter(pattern)],
      );
    }
  }
@override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: ListView(
          shrinkWrap: true,
          children: <Widget>[
            customTextField(TextInputType.visiblePassword),
            customTextField(TextInputType.emailAddress),
          ],
        ),
      ),
    );
  }