Flutter功能未知插件must_be的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter 功能未知插件 must_be 的使用

是的,你没有看错,这是另一个验证包。

但是它更符合 Dart 的习惯用法,例如,使用级联语法进行值验证。

这类似于一个在测试中检查值的框架。

requireThat('value')..mustBeGreaterThan(6)..mustBeLessThanOrEqualTo(10)

目前包含常见的验证和巴西的数据验证(如:RG、CPF、CNH、CEP 等)。

在数据中设置约束

对一个值进行验证。

requireThat('teste@gmail.com').mustBeEmail()

你可以设置验证字段名。

requireThat('teste@gmail.com', name: 'email').mustBeEmail()

但如果日期违反了限制会发生什么? 会抛出一个带有违反约束的消息的 异常,如果存在字段名,则消息中也会包含该字段名。

requireThat('teste@gmail.com').mustBeEmail('error')

如果我想定义更多的约束呢?

这个 Dart 方面由我们来处理,所以让我们使用级联操作符语法。

requireThat('value')..mustBeGreaterThan(6)..mustBeLessThanOrEqualTo(10)

这真是太棒了。

创建你的约束

这里再次由 Dart 来帮助我们使用扩展方法。

首先,创建一个 Constraint 子类,例如:

class SameDay extends Constraint {
  const SameDay(this.date, [String? message]) : super(message);

  final DateTime date;
}

现在,为要验证的数据类型创建一个 Require 扩展,并调用你想要的方法(模式为 mustBe...),并在其中调用 mustBe 方法。

extension RequireString<T extends String> on Require<T?> {
  /// 验证 [String] 是否为空。
  void mustBeBlank([String? message]) =>
      mustBe(value?.trimLeft().isEmpty ?? true, Blank(message));
}

Require 中,你可以访问值和字段名(value 和 name)。

如何验证?

当一个约束被违反时,会抛出一个 异常,然后有一个支持函数可以捕获这个异常并返回其消息。如果没有违反约束,则返回 null

validate(
    () => requireThat(10).mustBeGreaterThan(10),
    ifNotValid: (_) => 'error',
) // 输出 -> 'error'

你还可以对每个违反的约束执行任何操作。

validate(
    () => requireThat(10)..mustBeGreaterThan(10)..mustBeLessThan(100),
     ifNotValid: (constraint) => switch (constraint.constraintViolation) {
        GreaterThanOrEqualTo(min: final min) =>
          'name must have at least $min characters',
        LessThan(max: final max) => 'name must be up to $max characters',
        _ => null,
    },),
)

你也可以使用 try/catch

对于自定义消息,请参阅下方的自定义错误消息部分。

它非常适合用于 TextFormFields 的验证。

TextFormField(
    validator: (value) => validate(
        () => requireThat(value, name: 'nick')
            ..mustBeGreaterThanOrEqualTo(3)
            ..mustBeLessThan(10),
    ),
    decoration: const InputDecoration(
        labelText: 'Nickname',
        border: OutlineInputBorder(),
    ),
),

自定义错误消息

如果你想在调用 validate 函数时更改默认的约束消息,可以使用 ValidationsLocalization

void main() {
    ValidationsLocalization.on<Email>((constraint) => '自定义消息 - ${constraintException.name}-${constraintException.value}');
}

这不会翻译或更改约束异常消息,为此请这样做:

requireThat('value').mustBeGreaterThan(5, '自定义消息');

validate 函数中有 ifNotValid 函数,然后传递你想要的消息,根据违反的约束。

validate
    () => requireThat(10).mustBeGreaterThan(0),
    ifNotValid: (constraint) => constraint.when({
        isType<LessThan>(): (_) => 'less',
        isType<GreaterThan>(): (_) => 'greater',
    }),
)

测试

有一个新的 matcher 用于抛出 ConstraintException

expect(
    () => requireThat(2, name: 'number').mustBeGreaterThan(2),
    throwsConstraintException<GreaterThan>(
        constraintMessage: '必须大于 2',
        name: 'number',
        value: 2,
    ),
);

维护者

Kauê Martins

支持

如果你喜欢这个包,请给它一个 ⭐️。如果你想帮忙,请:

  • Fork 这个仓库
  • 发送带有新功能的 Pull Request
  • 分享这个包
  • 如果你发现一个错误或想建议一个新的扩展,请创建一个 issue

Pull Request 标题遵循 Conventional Commits

许可证

版权所有 © 2023 Kauê Martins
该项目遵循 MIT 许可证。


完整示例 Demo

以下是完整的示例代码:

import 'dart:io';

import 'package:must_be/must_be.dart';

void main() {
  ValidationsLocalization.on<Blank>(
    (_) => '错误,没有正确答案',
  );

  while (true) {
    stdout.writeln("你的名字是什么?");
    final name = stdin.readLineSync();
    final msg = validate(
      () => requireThat(name)
        ..mustBeGreaterThanOrEqualTo(3)
        ..mustBeLessThanOrEqualTo(10),
      ifNotValid: (constraint) => switch (constraint.constraintViolation) {
        GreaterThanOrEqualTo(min: final min) =>
          '名字必须至少有 $min 个字符',
        LessThan(max: final max) => '名字最多只能有 $max 个字符',
        _ => null,
      },
    );
    if (msg == null) {
      break;
    }
    stdout.writeln(msg);
  }

  while (true) {
    stdout.writeln('你多大了?');
    final age = int.parse(stdin.readLineSync() ?? '0');
    try {
      requireThat(age, name: '年龄').mustBeGreaterThanOrEqualTo(
        18,
        '你还年轻,至少需要满 18 岁',
      );
      break;
    } on ConstraintException catch (exception) {
      stdout.writeln(exception.constraintViolation.message);
    }
  }

  stdout.writeln("最好的状态管理器是什么?");
  final stateManager = stdin.readLineSync();
  final notCorrectAnswer =
      validate(() => requireThat(stateManager).mustBeBlank());
  stdout.writeln(notCorrectAnswer ?? '好极了!');
}

更多关于Flutter功能未知插件must_be的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter功能未知插件must_be的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,如果你遇到了一个名为 must_be 的未知插件,并且想了解如何使用它,首先需要明确的是,Flutter的官方插件库中并没有一个直接名为 must_be 的插件。这可能意味着 must_be 是一个自定义插件、第三方库中的功能,或者是某个特定项目中的命名约定,而不是一个广泛使用的标准库。

不过,基于你的请求,我将提供一个假设性的代码案例,来展示如何在Flutter项目中集成和使用一个假设的 must_be 插件(如果它存在的话)。请注意,以下代码是假设性的,实际使用时需要根据 must_be 插件的真实API进行调整。

假设性的 must_be 插件使用案例

  1. 添加依赖: 首先,你需要在 pubspec.yaml 文件中添加 must_be 插件的依赖(如果它是一个公开的第三方插件)。但由于我们不知道它的真实名称和仓库,这里仅展示添加依赖的格式:

    dependencies:
      flutter:
        sdk: flutter
      must_be: ^x.y.z  # 假设的版本号
    

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

  2. 导入插件: 在你的 Dart 文件中导入 must_be 插件:

    import 'package:must_be/must_be.dart';
    
  3. 使用插件: 假设 must_be 插件提供了一个验证功能,我们可以这样使用它(这里的代码完全是假设性的):

    import 'package:flutter/material.dart';
    import 'package:must_be/must_be.dart';  // 导入假设的插件
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text('Must Be Plugin Demo'),
            ),
            body: Center(
              child: MustBeDemo(),
            ),
          ),
        );
      }
    }
    
    class MustBeDemo extends StatefulWidget {
      @override
      _MustBeDemoState createState() => _MustBeDemoState();
    }
    
    class _MustBeDemoState extends State<MustBeDemo> {
      String _result = '';
    
      void _validateInput(String input) {
        // 假设 must_be 插件有一个 validate 方法
        bool isValid = MustBe.validate(input, pattern: r'^\d+$');  // 假设验证数字
        setState(() {
          _result = isValid ? 'Valid input!' : 'Invalid input!';
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextField(
              decoration: InputDecoration(labelText: 'Enter something'),
              onChanged: (value) {
                _validateInput(value);
              },
            ),
            SizedBox(height: 20),
            Text(_result),
          ],
        );
      }
    }
    

    在上面的代码中,我们假设 MustBe 类有一个静态方法 validate,它接受一个输入字符串和一个正则表达式模式,并返回一个布尔值来表示输入是否有效。

结论

由于 must_be 并不是一个已知的Flutter插件或功能,上述代码完全是基于假设的。如果你确实遇到了一个名为 must_be 的插件,并且想要了解如何使用它,建议查阅该插件的官方文档或源代码,以获取准确的使用方法和API参考。如果它是一个项目内部的命名约定或自定义功能,那么你需要查看项目内部的文档或代码来实现正确的使用。

回到顶部