Flutter功能未知插件must_be的使用
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,
),
);
维护者
支持
如果你喜欢这个包,请给它一个 ⭐️。如果你想帮忙,请:
- 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
更多关于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
插件使用案例
-
添加依赖: 首先,你需要在
pubspec.yaml
文件中添加must_be
插件的依赖(如果它是一个公开的第三方插件)。但由于我们不知道它的真实名称和仓库,这里仅展示添加依赖的格式:dependencies: flutter: sdk: flutter must_be: ^x.y.z # 假设的版本号
然后运行
flutter pub get
来获取依赖。 -
导入插件: 在你的 Dart 文件中导入
must_be
插件:import 'package:must_be/must_be.dart';
-
使用插件: 假设
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参考。如果它是一个项目内部的命名约定或自定义功能,那么你需要查看项目内部的文档或代码来实现正确的使用。