繁体   English   中英

可重用小部件 - 参数错误 - 无法添加可选参数

Reusable Widget - Error with parameter - can not add optional parameter

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试创建一个可重用的小部件。 但是,如果我可以设置所有参数,我不想强制所有参数。 我只想使用 4 或 5 个参数。 其他的将是可选的。 我做了一些研究并尝试在可选参数上添加 [],但我收到了错误消息。

错误:参数“parametersValidate”因其类型而不能具有“null”值,但隐式默认值为“null”。

如果您能帮我解决这个问题,我们将不胜感激。

class TextFormFieldWidget extends StatefulWidget {

   String hintText;
   Widget prefixIcon;
   String defaultText;
   TextInputType textInputType;
   FocusNode focusNode;
   bool obscureText;
   TextEditingController controller;
   Function functionValidate;
   String parametersValidate;
   TextInputAction actionKeyboard;
   Function onSubmitField;
   Function onFieldTap;

    TextFormFieldWidget(

        this.hintText,
        this.textInputType,
        this.controller,
        [this.parametersValidate],
        this.onSubmitField,
        this.onFieldTap,
        this.defaultText,

      {Key? key,
        required this.actionKeyboard,
        required this.prefixIcon,
        required this.focusNode,
        required this.obscureText,
        required this.functionValidate,
      }
      ) : super(key: key);

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

class _TextFormFieldWidgetState extends State<TextFormFieldWidget> {
  double bottomPaddingToError = 12;

  @override
  Widget build(BuildContext context) {
    return Theme(
      data: Theme.of(context).copyWith(
        primaryColor: Colors.black,
      ),
      child: TextFormField(
        cursorColor: Colors.black,
       // obscureText: widget.obscureText,
        keyboardType: widget.textInputType,
        textInputAction: widget.actionKeyboard,
      //  focusNode: widget.focusNode,
        style: const TextStyle(
          color: Colors.black,
          fontSize: 16.0,
          fontWeight: FontWeight.w200,
          fontStyle: FontStyle.normal,
          letterSpacing: 1.2,
        ),
        initialValue: widget.defaultText,
        decoration: InputDecoration(
          prefixIcon: widget.prefixIcon,
          hintText: widget.hintText,
          enabledBorder: const OutlineInputBorder(
            borderSide: BorderSide(color: Colors.black),
          ),
          focusedBorder: const OutlineInputBorder(
            borderSide: BorderSide(color: Colors.black),
          ),
          hintStyle: const TextStyle(
            color: Colors.grey,
            fontSize: 14.0,
            fontWeight: FontWeight.w300,
            fontStyle: FontStyle.normal,
            letterSpacing: 1.2,
          ),
          contentPadding: EdgeInsets.only(
              top: 12, bottom: bottomPaddingToError, left: 8.0, right: 8.0),
          isDense: true,
          errorStyle: const TextStyle(
            color: Colors.red,
            fontSize: 12.0,
            fontWeight: FontWeight.w300,
            fontStyle: FontStyle.normal,
            letterSpacing: 1.2,
          ),
          errorBorder: const OutlineInputBorder(
            borderSide: BorderSide(color: Colors.black),
          ),
          focusedErrorBorder: const OutlineInputBorder(
            borderSide: BorderSide(color: Colors.black),
          ),
        ),
        controller: widget.controller,
        validator: (value) {
          if (widget.functionValidate != null) {
            String resultValidate =
            widget.functionValidate(value, widget.parametersValidate);
            if (resultValidate != null) {
              return resultValidate;
            }
          }
          return null;
        },
        onFieldSubmitted: (value) {
          if (widget.onSubmitField != null) widget.onSubmitField();
        },
        onTap: () {
          if (widget.onFieldTap != null) widget.onFieldTap();
        },
      ),
    );
  }
}

String? commonValidation(String value, String messageError) {
  var required = requiredValidator(value, messageError);
  if (required != null) {
    return required;
  }
  return null;
}

String? requiredValidator(value, messageError) {
  if (value.isEmpty) {
    return messageError;
  }
  return null;
}

void changeFocus(
    BuildContext context, FocusNode currentFocus, FocusNode nextFocus) {
  currentFocus.unfocus();
  FocusScope.of(context).requestFocus(nextFocus);
}


1 个回复

试试下面的代码:

class TextFormFieldWidget extends StatefulWidget {

   String hintText;
   Widget? prefixIcon;
   String? defaultText;
   TextInputType? textInputType;
   FocusNode? focusNode;
   bool? obscureText;
   TextEditingController controller;
   Function? functionValidate;
   String? parametersValidate;
   TextInputAction? actionKeyboard;
   Function onSubmitField;
   Function? onFieldTap;

    TextFormFieldWidget({
        Key? key,
        required this.hintText,
        this.textInputType,
        required this.controller,
        this.parametersValidate,
        required this.onSubmitField,
        this.onFieldTap,
        this.defaultText,
        this.actionKeyboard,
        this.prefixIcon,
        this.focusNode,
        this.obscureText,
        this.functionValidate,
      }) : super(key: key);

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

class _TextFormFieldWidgetState extends State<TextFormFieldWidget> {
  double bottomPaddingToError = 12;

  @override
  Widget build(BuildContext context) {
    return Theme(
      data: Theme.of(context).copyWith(
        primaryColor: Colors.black,
      ),
      child: TextFormField(
        cursorColor: Colors.black,
       // obscureText: widget.obscureText,
        keyboardType: widget.textInputType,
        textInputAction: widget.actionKeyboard,
      //  focusNode: widget.focusNode,
        style: const TextStyle(
          color: Colors.black,
          fontSize: 16.0,
          fontWeight: FontWeight.w200,
          fontStyle: FontStyle.normal,
          letterSpacing: 1.2,
        ),
        initialValue: widget.defaultText,
        decoration: InputDecoration(
          prefixIcon: widget.prefixIcon,
          hintText: widget.hintText,
          enabledBorder: const OutlineInputBorder(
            borderSide: BorderSide(color: Colors.black),
          ),
          focusedBorder: const OutlineInputBorder(
            borderSide: BorderSide(color: Colors.black),
          ),
          hintStyle: const TextStyle(
            color: Colors.grey,
            fontSize: 14.0,
            fontWeight: FontWeight.w300,
            fontStyle: FontStyle.normal,
            letterSpacing: 1.2,
          ),
          contentPadding: EdgeInsets.only(
              top: 12, bottom: bottomPaddingToError, left: 8.0, right: 8.0),
          isDense: true,
          errorStyle: const TextStyle(
            color: Colors.red,
            fontSize: 12.0,
            fontWeight: FontWeight.w300,
            fontStyle: FontStyle.normal,
            letterSpacing: 1.2,
          ),
          errorBorder: const OutlineInputBorder(
            borderSide: BorderSide(color: Colors.black),
          ),
          focusedErrorBorder: const OutlineInputBorder(
            borderSide: BorderSide(color: Colors.black),
          ),
        ),
        controller: widget.controller,
        validator: (value) {
          if (widget.functionValidate != null) {
            String resultValidate =
            widget.functionValidate(value, widget.parametersValidate);
            if (resultValidate != null) {
              return resultValidate;
            }
          }
          return null;
        },
        onFieldSubmitted: (value) {
          if (widget.onSubmitField != null) widget.onSubmitField();
        },
        onTap: () {
          if (widget.onFieldTap != null) widget.onFieldTap();
        },
      ),
    );
  }
}

String? commonValidation(String value, String messageError) {
  var required = requiredValidator(value, messageError);
  if (required != null) {
    return required;
  }
  return null;
}

String? requiredValidator(value, messageError) {
  if (value.isEmpty) {
    return messageError;
  }
  return null;
}

void changeFocus(
    BuildContext context, FocusNode currentFocus, FocusNode nextFocus) {
  currentFocus.unfocus();
  FocusScope.of(context).requestFocus(nextFocus);
}
1 将参数传递给可重用的小部件

我正在尝试使用可重用的小部件,并且我想从我的小部件调用中向它发送一个参数,该参数对于每次重用都会有所不同 我想在这里使用它而不是“0.jpg”之类的 $id.jpg 目标是根据小部件获得不同的照片 太感谢了! ...

3 Flutter - 如何在可重用的小部件中将 Bloc 作为参数传递?

我正在构建一个登录页面,并且我已经创建了我打算用作完全动态的 TextField 小部件的内容。 我现在需要创建该小部件的 2 个实例(电子邮件和密码输入)并发送hintText、errorText 的参数,然后是我的 LoginBloc 和验证方法,这对于每个输入来说当然是不同的。 我的问题是 ...

4 有条件地将可选参数传递给小部件

我有一个自定义小部件,可以选择传递size属性。 如果存在,此值应传递给我自己的小部件中Icon()小部件的size属性。 如果它存在,有没有办法只传递这个值? ...

5 向原型添加可选参数

在一个模块(不是我写的)中,我有一个原型子,它接受一个代码引用并返回 eval 的结果: 原型子在许多模块中经常被调用。 现在我需要更改它并想要添加一个可选参数,例如: 但这会导致 $OptionalParameter 的警告“在无效上下文中无用使用私有变量”。 我还将原型声明更改为 (&a ...

6 数据库可选参数错误

我的动态查询遇到问题,因为我有一些空值。 如果没有任何值,我已将值设为可选,但仍然出现错误。 有什么想法吗? 这是我对数据库连接器的动态查询。 我认为问题出在经纪人和棉花组织的声明上 这是我的示例输入文件。 ...

7 ocaml中的可选参数错误

我正在尝试创建一个将采用true或false向量的函数。 此向量表示一个二进制数,我想在函数中将其转换为整数。这是我的代码 但是我在处理可选参数时总是遇到错误,我不确定我到底在做什么错,因为我刚接触Ocaml ...

8 ActionLink可选参数错误

我在视图中使用以下代码,并且尝试使用其他参数在最后添加撤回链接,但出现以下错误: System.ArgumentException:参数字典在'MaxMe2.Controllers.TeamController'中为方法'System.Web.Mvc.ActionResult Withdr ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM