简体   繁体   English

如何更改 Textformfield 验证文本的 position? Flutter

[英]How can I change the position of the Textformfield validation text ? Flutter

I made a custom form and when I want to use the validation.我制作了一个自定义表单以及何时使用验证。 My issue is that the error message is not appearing as I wanted.我的问题是错误消息没有按我的意愿出现。 Here's the screenshot of it.这是它的屏幕截图。

在此处输入图像描述

So I want to change the position of the error message to be below my container.所以我想将错误消息的 position 更改为在我的容器下方。 Does anyone have any idea how to do it?有谁知道该怎么做?

Here's the code of the form:这是表单的代码:

class AuthForm extends StatefulWidget {
  final bool isPassword;
  final IconData prefixIcon;
  final String hintText;
  late bool isPasswordVisible = isPassword;
  final bool isCalendar;
  final TextEditingController controller;
  final bool isDropDown;
  final bool isPhone;
  final String? Function(String?)? validator;

  AuthForm({Key? key, this.isPassword = false, required this.prefixIcon, required this.hintText,
    this.isCalendar = false, required this.controller, this.isDropDown = false, this.isPhone = false, required this.validator}) : super(key: key);

  @override
  State<AuthForm> createState() => _AuthFormState();
}

class _AuthFormState extends State<AuthForm> {

  @override
  void initState() {
    super.initState();
    if (widget.isPhone){
      getCountryCode();
    }
  }

  start () async {
    await CountryCodes.init();
  }
  Locale? getCountryCode () {
    start();
    final Locale? deviceLocale = CountryCodes.getDeviceLocale();
    final CountryDetails details = CountryCodes.detailsForLocale();
    return deviceLocale;
  }

  DateTime selectedDate = DateTime(2000,1);
  Future<void> _selectDate(BuildContext context) async {
    final DateTime? picked = await showDatePicker(
        context: context,
        initialDate: selectedDate,
        firstDate: DateTime(1950, 1),
        lastDate: DateTime.now());
    if (picked != null && picked != selectedDate) {
      setState(() {
        selectedDate = picked;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      width: 70.w,
      height: 5.h,
      decoration: BoxDecoration(
        border: Border(
          bottom: BorderSide(
            width: 0.13.w,
            color: Theme.of(context).splashColor,
          ),
        ),
      ),
      child: Row(
        crossAxisAlignment: CrossAxisAlignment.center,
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: [
          Icon(
            widget.prefixIcon,
            color: Theme.of(context).primaryColor,
            size: 6.w,
          ),
          widget.isDropDown ? const DropDownBar() :
          Expanded(
            child: TextFormField(
              //autovalidateMode: AutovalidateMode.onUserInteraction,
              validator: widget.validator,
              keyboardType: widget.isPhone ? TextInputType.phone : TextInputType.text,
              inputFormatters: [DialCodeFormatter()],
              controller: widget.controller,
              textAlign: TextAlign.center,
              obscureText: widget.isPasswordVisible,
              style: Theme.of(context).textTheme.bodyText2,
              decoration: InputDecoration(
                hintText : widget.hintText,
                hintStyle: Theme.of(context).textTheme.bodyText1,
                border: InputBorder.none,
              ),
              onTap: () async {
                if (widget.isCalendar){
                  //Dismiss the keyboard
                  FocusScope.of(context).requestFocus(FocusNode());
                  //Call the calendar
                  await _selectDate(context);
                  widget.controller.text = DateFormat('dd-MM-yyyy').format(selectedDate);
                }
              }
            ),
          ),
          //Show Icon only if the form is for a Password
          Visibility(
            visible: widget.isPassword,
            //Maintain the space where the widget is even if it is hid
            maintainAnimation: true,
            maintainState: true,
            maintainSize: true,
            child: InkWell(
              highlightColor : Colors.transparent,
              splashColor: Colors.transparent,
              child: Icon(
                widget.isPasswordVisible ? Icons.visibility : Icons.visibility_off,
                color: Theme.of(context).primaryColor,
                size: 6.w,
              ),
              onTap: () {
                setState(() {
                  widget.isPasswordVisible = !widget.isPasswordVisible;
                });
              },
            ),
          ),
        ],
      ),
    );
  }
}

Thanks for your suggestion,谢谢你的建议,

Chris克里斯

You should try below piece of code for TextFormField您应该尝试下面的TextFormField代码

TextFormField(
                      textInputAction: TextInputAction.next,
                      style: TextStyle(fontSize: 16, height: 1),
                      inputFormatters: <TextInputFormatter>[FilteringTextInputFormatter.digitsOnly, LengthLimitingTextInputFormatter(10)],
                      keyboardType: TextInputType.phone,
                      validator: (val) {
                        if (val!.isEmpty) {
                          return 'Please enter your mobile number';
                        } else if (val.length < 10) {
                          return 'Mobile number should be 10 digits only';
                        }
                      },
                      controller: bloc.mobileNumberLoginController,
                      decoration: InputDecoration(
                        filled: true,
                        border: OutlineInputBorder(
                            borderSide: BorderSide(
                          color: code != null ? HexColor(code!) : Colors.pink,
                        )),
                        contentPadding: EdgeInsets.only(top: 5, bottom: 5, left: 10, right: 10),
                      ),
                    ),

输出

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

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