Flutter地图验证插件map_validation的使用

Flutter地图验证插件map_validation的使用

Map Validation Package 提供了一种灵活且可扩展的方式来验证Dart中的Map数据。它受Joi.js启发,支持多种数据类型、自定义错误消息以及国际化功能。

安装

要将此包添加到您的Dart项目中,请在pubspec.yaml文件中包含以下依赖项:

dependencies:
  map_validation: ^1.0.0

然后运行flutter pub get以安装该包。

使用

定义验证方案

您可以使用可用的验证器创建一个验证方案。以下是一个基本示例:

import 'package:map_validation/src/validators/boolean_validator.dart';
import 'package:map_validation/src/validators/date_validator.dart';
import 'package:map_validation/src/validators/number_validator.dart';
import 'package:map_validation/src/validation_schema.dart';
import 'package:map_validation/src/exceptions/validation_exception.dart';

void main() {
  final schema = ValidatorSchema({
    'is_active': BooleanValidator(
      isRequired: true,
      requiredMessage: 'O campo ativo é obrigatório.',
      invalidMessage: 'O valor deve ser um booleano.',
    ),
    'start_date': DateValidator(
      minDate: DateTime(2023, 1, 1),
      maxDate: DateTime(2024, 12, 31),
      isRequired: true,
      requiredMessage: 'A data de início é obrigatória.',
      minDateMessage: 'A data deve ser após {minDate}.',
      maxDateMessage: 'A data deve ser antes de {maxDate}.',
    ),
    'total_amount': NumberValidator(
      min: 10,
      max: 1000,
      isInteger: true,
      isRequired: true,
      requiredMessage: 'O valor total é obrigatório.',
      minMessage: 'O valor deve ser pelo menos {min}.',
      maxMessage: 'O valor não deve exceder {max}.',
    ),
    'discount_code': NumberValidator(
      isRequired: false, // 可选字段
      isInteger: false, // 可以为小数
      min: 0,
      max: 100,
      minMessage: 'O desconto deve ser pelo menos {min}%. ',
      maxMessage: 'O desconto não deve exceder {max}%. ',
    ),
  }, locale: 'pt_BR'); // 设置语言为葡萄牙语

  final validData = {
    'is_active': true,
    'start_date': DateTime(2023, 6, 15),
    'total_amount': 150,
    'discount_code': 25,
  };

  final invalidData = {
    'is_active': 'yes', // 类型无效
    'start_date': DateTime(2025, 1, 1), // 超出范围
    'total_amount': 5, // 低于最小值
    'discount_code': 150, // 超过最大值
  };

  // 验证有效数据
  try {
    schema.validate(validData);
    print('Valid Data: No Errors');
  } catch (e) {
    if (e is ValidationException) {
      print('Errors with Valid Data: ${e.errors}');
    }
  }

  // 验证无效数据
  try {
    schema.validate(invalidData);
  } catch (e) {
    if (e is ValidationException) {
      print('Errors with Invalid Data: ${e.errors}');
    }
  }
}

可用的验证器

BooleanValidator

用于验证布尔值。允许定义字段是否必填以及自定义错误消息。

import 'package:map_validation/src/validators/boolean_validator.dart';

final validator = BooleanValidator(
  isRequired: true,
  requiredMessage: 'O campo é obrigatório.',
  invalidMessage: 'Deve ser um booleano.',
);

DateValidator

用于验证日期,并支持最小和最大日期限制及自定义错误消息。

import 'package:map_validation/src/validators/date_validator.dart';

final validator = DateValidator(
  minDate: DateTime(2023, 1, 1),
  maxDate: DateTime(2024, 12, 31),
  isRequired: true,
  requiredMessage: 'Data é obrigatória.',
  minDateMessage: 'Data deve ser após {minDate}.',
  maxDateMessage: 'Data deve ser antes de {maxDate}.',
);

NumberValidator

用于验证数字,并支持最小和最大值限制以及是否必须为整数的选项。包括自定义错误消息。

import 'package:map_validation/src/validators/number_validator.dart';

final validator = NumberValidator(
  min: 10,
  max: 1000,
  isInteger: true,
  isRequired: true,
  requiredMessage: 'Número é obrigatório.',
  minMessage: 'Número deve ser pelo menos {min}.',
  maxMessage: 'Número não deve exceder {max}.',
);

StringValidator

用于验证字符串,并支持最小和最大长度以及正则表达式模式。包括自定义错误消息。

import 'package:map_validation/src/validators/string_validator.dart';

final validator = StringValidator(
  minLength: 3,
  maxLength: 30,
  pattern: RegExp(r'^[a-zA-Z0-9_]+$'),
  isRequired: true,
  requiredMessage: 'O nome é obrigatório.',
  minLengthMessage: 'O nome deve ter pelo menos {minLength} caracteres.',
  maxLengthMessage: 'O nome deve ter no máximo {maxLength} caracteres.',
  patternMessage: 'O nome deve conter apenas letras, números e sublinhados.',
);

ConditionalValidator

根据其他字段的值来验证某个字段。允许定义条件函数和自定义错误消息。

import 'package:map_validation/src/validators/conditional_validator.dart';

final validator = ConditionalValidator<String, String>(
  condition: (value, dependentValue, data) => value == dependentValue,
  dependentValue: 'password',
  errorMessageKey: 'repeat_password_mismatch',
  customMessage: 'A confirmação da senha deve corresponder à senha.',
);

MultiValidator

用于验证可以接受多种类型值的字段,例如数字或字符串。

import 'src/validators/multi_validator.dart';
import 'src/validators/string_validator.dart';
import 'src/validators/number_validator.dart';

void main() {
  final multiValidator = MultiValidator([
    StringValidator(minLength: 3),
    NumberValidator(min: 10, max: 100)
  ]);

  final value = '123'; // 可以是字符串或数字

  if (multiValidator.validate(value)) {
    print('O valor é válido.');
  } else {
    print('Erros de validação: ${multiValidator.errors}');
  }
}

错误处理

验证错误作为ValidationException异常抛出,包含每个字段的错误映射。

import 'package:map_validation/src/exceptions/validation_exception.dart';

try {
  // 验证数据
} catch (e) {
  if (e is ValidationException) {
    print('Erros: ${e.errors}');
  }
}

更多关于Flutter地图验证插件map_validation的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地图验证插件map_validation的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


map_validation 是一个用于在 Flutter 应用中验证地图数据的插件。它可以帮助开发者确保地图数据(如坐标、边界、区域等)符合特定的规则或标准。以下是如何使用 map_validation 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 map_validation 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  map_validation: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的 Dart 文件中导入 map_validation 插件:

import 'package:map_validation/map_validation.dart';

3. 使用插件进行验证

map_validation 插件提供了多种验证方法,以下是一些常见的用法示例:

验证坐标是否在特定区域内

void validateCoordinate() {
  LatLng coordinate = LatLng(37.7749, -122.4194); // 示例坐标
  LatLngBounds bounds = LatLngBounds(
    northeast: LatLng(37.7849, -122.4094),
    southwest: LatLng(37.7649, -122.4294),
  );

  bool isValid = MapValidation.isCoordinateWithinBounds(coordinate, bounds);
  print('Coordinate is within bounds: $isValid');
}

验证多边形是否闭合

void validatePolygon() {
  List<LatLng> polygon = [
    LatLng(37.7749, -122.4194),
    LatLng(37.7849, -122.4094),
    LatLng(37.7649, -122.4294),
    LatLng(37.7749, -122.4194), // 闭合多边形
  ];

  bool isClosed = MapValidation.isPolygonClosed(polygon);
  print('Polygon is closed: $isClosed');
}

验证两个多边形是否相交

void validatePolygonIntersection() {
  List<LatLng> polygon1 = [
    LatLng(37.7749, -122.4194),
    LatLng(37.7849, -122.4094),
    LatLng(37.7649, -122.4294),
    LatLng(37.7749, -122.4194),
  ];

  List<LatLng> polygon2 = [
    LatLng(37.7749, -122.4194),
    LatLng(37.7849, -122.4094),
    LatLng(37.7649, -122.4294),
    LatLng(37.7749, -122.4194),
  ];

  bool intersects = MapValidation.doPolygonsIntersect(polygon1, polygon2);
  print('Polygons intersect: $intersects');
}

4. 处理验证结果

根据验证结果,你可以执行相应的操作,例如显示错误消息、更新 UI 或继续执行其他逻辑。

5. 错误处理

在使用 map_validation 插件时,可能会遇到一些异常情况,例如无效的输入数据。你可以使用 try-catch 块来捕获并处理这些异常:

void validateData() {
  try {
    // 调用验证方法
  } catch (e) {
    print('An error occurred: $e');
  }
}
回到顶部