如何删除验证文本?

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

这是我的自定义验证文本字段

CmnTextField(
                    labelText: "Location",
                    controller: LocationController,
                    readOnly: true,
                    autoValidateMode: controller.unit
                        ? AutovalidateMode.always
                        : AutovalidateMode.disabled,
                    onTap: () async {
                      final result = await Navigator.of(context).push(MaterialPageRoute(
                          builder: (_) => SelectLocation(whichLocation: 'From Location')));
                      if (result != null && result is Locations) {
                        _assignFromLocation(result);
                      }
                    },
                    validator: _validateInput,
                    enabled: isEdit
                        ? false
                        : controller.isMove ||
                            controller.isCustomMove ||
                            controller.unit,
                  ),

这是我的验证功能:

String? _validateInput(String? value) {
    if (controller.unit) {
      if (value == null || value.isEmpty) {
        return 'required';
      }
    }
    return null;
  }

controller.unit 这是条件为真时,禁用文本字段并删除验证,当此条件为假时,我需要自动验证模式,那么我如何才能实现这一点?

如果有人有任何想法请告诉我

flutter dart validation uitextfield
1个回答
0
投票

要实现所需的行为,其中:

  1. controller.unit
    true
    时:

    • 禁用
      TextField
    • 删除验证。
  2. controller.unit
    false
    时:

    • 启用
      TextField
    • 使用
      AutovalidateMode.always
      启用自动验证,并在用户与字段交互时执行验证。

您可以通过根据

enabled
的值管理
autoValidateMode
validator
TextField
controller.unit
属性来实现此目的。

以下是构建

CmnTextField
小部件的方法:

更新代码:

CmnTextField(
  labelText: "Location",
  controller: LocationController,
  readOnly: true,
  // Set autoValidateMode based on controller.unit
  autoValidateMode: controller.unit
      ? AutovalidateMode.disabled  // Disable auto-validation when controller.unit is true
      : AutovalidateMode.always,  // Enable auto-validation when controller.unit is false
  onTap: () async {
    final result = await Navigator.of(context).push(
      MaterialPageRoute(
        builder: (_) => SelectLocation(whichLocation: 'From Location')
      )
    );
    if (result != null && result is Locations) {
      _assignFromLocation(result);
    }
  },
  // Validator function, which is only called when the TextField is enabled
  validator: _validateInput,
  // Enable or disable the TextField based on controller.unit and other flags
  enabled: !(controller.unit || isEdit) && (controller.isMove || controller.isCustomMove)
)

验证功能:

String? _validateInput(String? value) {
  // Only perform validation if the TextField is enabled and controller.unit is false
  if (!controller.unit) {
    if (value == null || value.isEmpty) {
      return 'Required';  // Show 'Required' error if the field is empty
    }
  }
  return null;  // Return null if validation passes
}

说明:

  1. autoValidateMode

    • controller.unit
      true
      时,我们使用
      AutovalidateMode.disabled
      禁用自动验证。
    • controller.unit
      false
      时,我们使用
      AutovalidateMode.always
      启用自动验证。这意味着当字段更改时将立即进行验证。
  2. enabled

    • controller.unit
      true
      时,
      TextField
      被禁用,用户无法与其交互。
    • controller.unit
      false
      时,
      TextField
      基于其他标志(
      isEdit
      controller.isMove
      controller.isCustomMove
      )启用。如果
      isEdit
      true
      ,则该字段被禁用,否则,取决于移动标志。
  3. 验证器

    • 验证器仅在启用该字段时运行(即,当
      controller.unit
      false
      时)。
    • 如果
      controller.unit
      true
      ,则该字段被禁用,并且不会进行验证。
    • 如果该字段为空且需要验证,则返回
      'Required'

结果:

  • controller.unit
    true
    时,
    TextField
    将被禁用,自动验证被关闭,并且不会进行任何验证。
  • controller.unit
    false
    时,
    TextField
    将启用,自动验证将启用,验证将按预期进行。
© www.soinside.com 2019 - 2024. All rights reserved.