Flutter功能扩展插件vit_dart_extensions的使用
Flutter功能扩展插件vit_dart_extensions的使用
vit_dart_extensions
是一个Dart包,提供了一系列扩展方法,用于增强各种数据类型(如 int
、String
、DateTime
和 Map
等)的功能。这些扩展方法旨在与现有的Dart代码无缝集成,使代码更加简洁和易读。
1. DateTime 扩展
1.1 formatAsReadable
将 DateTime
格式化为可读的字符串,可以选择是否显示时间。
final dt = DateTime(2023, 1, 30, 13, 22);
String dateAndTime = dt.formatAsReadable(); // "30/01/2023 13:22"
String dateOnly = dt.formatAsReadable(false); // "30/01/2023"
1.2 fromEuropean
从欧洲日期格式(DD/MM/YYYY)解析字符串为 DateTime
。
DateTime europeanDate = DateTime.fromEuropean('30/01/2023');
1.3 pickRandom
在两个可选的 DateTime
参数之间随机选择一个 DateTime
。如果没有提供参数,默认从Unix纪元(1970年1月1日)开始到当前时间结束。
var randomDt = DateTime.pickRandom();
2. Directory 扩展
2.1 listDirectoryFiles
列出目录中的所有文件,处理读取目录时可能出现的权限问题。
var dir = Directory('some/path');
Stream<File> files = dir.listDirectoryFiles(
onDirectoryReadError: (Directory directory, Object error) {
// 处理目录读取错误
},
);
3. Duration 扩展
3.1 toReadable
将 Duration
转换为可读的字符串格式。
Duration duration = Duration(days: 1, hours: 3, minutes: 23, seconds: 5, milliseconds: 101);
print(duration.toReadable()); // '1d 3h'
4. double 扩展
4.1 toStringAsFixedRounded
将 double
转换为指定小数位数的字符串,如果小数部分为零,则不显示小数部分。
double a = 4.0;
print(a.toStringAsFixedRounded(2)); // "4"
double b = 3.14150;
print(b.toStringAsFixedRounded(5)); // "3.1415"
5. File 扩展
5.1 getName
返回文件名,可以选择是否包含扩展名。
var file = File('/root/directory/file.mp3');
print(file.getName()); // 'file'
print(file.getName(true)); // 'file.mp3'
6. int 扩展
6.1 readableByteSize
将字节数转换为可读的字符串格式。
print(500.readableByteSize()); // 500 B
print(1024.readableByteSize()); // 1 KB
print(2148.readableByteSize()); // 2.1 KB
print(1048576.readableByteSize()); // 1 MB
print(1073741824.readableByteSize()); // 1 GB
7. Iterable 扩展
7.1 chunk
将可迭代对象分割成多个子列表,每个子列表的最大长度为指定的大小。
final numbers = [1, 2, 3, 4, 5, 6];
final chunks = numbers.chunk(2);
print(chunks); // ([1, 2], [3, 4], [5, 6])
7.2 firstWhereOrNull
查找满足给定条件的第一个元素,如果找不到则返回 null
。
List<String> names = ['Bob', 'Alice', 'Tom'];
String? firstNameStartingWithA = names.firstWhereOrNull((name) => name.startsWith('A'));
print(firstNameStartingWithA); // Output: Alice
7.3 separatedBy
在可迭代对象的每个元素之间插入指定的分隔符。
final letters = ['a', 'b', 'c'];
final spacedLetters = letters.separatedBy('-');
print(spacedLetters); // ['a', '-', 'b', '-', 'c']
7.4 pickRandom
从可迭代对象中随机选择一个元素。
Iterable<String> names = ['Bob', 'Alice', 'Tom', 'Fiona'];
print(names.pickRandom()); // 'Bob' 或 'Alice' 或 'Tom' 或 'Fiona'
7.5 removeIndices
移除指定索引位置的元素。
Iterable<String> names = ['Bob', 'Alice', 'Tom', 'Fiona'];
Iterable<String> filtered = names.removeIndices({1, 3});
print(filtered); // ('Bob', 'Tom')
8. List 扩展
8.1 prettyJSON
将列表转换为缩进的JSON字符串。
final list = [{'name': 'John Doe', 'age': 30}, {'name': 'Jane Doe', 'age': 27}];
print(list.prettyJSON);
/*
[
{
"name": "John Doe",
"age": 30
},
{
"name": "Jane Doe",
"age": 27
}
]
*/
8.2 sortByDate
根据日期对列表进行排序。
void sortByDate(DateTime Function(T item) getter, [bool asc = true]);
8.3 sortByNum
根据数字对列表进行排序。
void sortByNum(num Function(T item) getter, [bool asc = true]);
8.4 sortByNumericString
假设提取的字符串是数字,对列表进行排序。
void sortByNumericString(
String Function(T item) getter, {
bool asc = true,
bool appendNonNumbersAtEnd = true,
});
8.5 sortByString
根据字符串对列表进行排序。
void sortByString(String Function(T item) getter, [bool asc = true]);
9. Map<String, dynamic> 扩展
9.1 tryGetDateTime
尝试从 Map
中读取并解析为 DateTime
,如果失败则返回 null
。
Map<String, dynamic> json = { ... };
DateTime? dt = json.tryGetDateTime('timestamp');
9.2 getDateTime
从 Map
中读取并解析为 DateTime
,如果失败则抛出 FormatException
。
Map<String, dynamic> json = { ... };
DateTime dt = json.getDateTime('timestamp');
9.3 getDouble
从 Map
中读取并转换为 double
,如果失败则抛出 FormatException
。
var map = {'a': 1, 'b': '2.5', 'c': 'three'};
print(map.getDouble('a')); // 1.0
print(map.getDouble('b')); // 2.5
print(map.getDouble('c')); // throws FormatException
9.4 tryGetDouble
尝试从 Map
中读取并转换为 double
,如果失败则返回 null
。
var map = {'a': 1, 'b': '2.5', 'c': 'three'};
print(map.tryGetDouble('a')); // 1.0
print(map.tryGetDouble('b')); // 2.5
print(map.tryGetDouble('c')); // null
9.5 getList
从 Map
中读取并转换为指定类型的列表。
var map = {
'ints': [1, 2, 3],
'strings': ['a', 'b', 'c'],
'mixed': [null, '2', 3.0],
'notArray': 12,
};
print(map.getList<int>('ints', (x) => x as int?)); // [1, 2, 3]
print(map.getList<String>('strings', (x) => x as String?)); // ['a', 'b', 'c']
print(map.getList<double>('mixed', (x) => double.tryParse(x.toString()))); // [2.0, 3.0]
print(map.getList<String>('notArray', (x) => x as String)); // []
9.6 prettyJSON
将 Map
转换为缩进的JSON字符串。
Map<String, dynamic> map = {
'name': 'Vinícius',
'enabled': true,
};
print(map.prettyJSON);
// "{
// "name": "Vinícius",
// "enabled": true
// }"
10. String 扩展
10.1 count
计算指定模式在字符串中出现的次数。
String text = "Hello World";
print(text.count("l")); // 3
10.2 toMaybeDate
将字符串转换为 DateTime
对象,支持ISO-8601和DD/MM/(YYYY|YY)[ HH:mm]格式。
String isoDateString = "2022-01-01";
String brDateString = "01/01/2022";
print(isoDateString.toMaybeDate()); // Outputs: 2022-01-01 00:00:00.000
print(brDateString.toMaybeDate()); // Outputs: 2022-01-01 00:00:00.000
10.3 insertAt
在指定索引处插入字符串。
String originalString = "HelloWorld";
print(originalString.insertAt(5, " ")); // Outputs: "Hello World"
10.4 isEmail
检查字符串是否为有效的电子邮件地址。
String email = "example@example.com";
String nonEmail = "notAnEmail";
print(email.isEmail); // Outputs: true
print(nonEmail.isEmail); // Outputs: false
10.5 hasUpperCase
检查字符串是否包含大写字母。
String text1 = 'Hello world';
print(text1.hasUpperCase); // Output: true
String text2 = 'hello world';
print(text2.hasUpperCase); // Output: false
10.6 hasLowerCase
检查字符串是否包含小写字母。
String text1 = 'Hello world';
print(text1.hasLowerCase); // Output: true
String text2 = 'HELLO WORLD';
print(text2.hasLowerCase); // Output: false
10.7 hasNumber
检查字符串是否包含数字。
String text1 = 'Hello123';
print(text1.hasNumber); // Output: true
String text2 = 'Hello';
print(text2.hasNumber); // Output: false
10.8 hasSymbol
检查字符串是否包含特殊符号。
String text1 = 'Hello@World';
print(text1.hasSymbol); // Output: true
String text2 = 'HelloWorld';
print(text2.hasSymbol); // Output: false
10.9 hasLengthBetween
检查字符串的长度是否在指定范围内。
String text = 'Hello';
print(text.hasLengthBetween(3, 6)); // Output: true
print(text.hasLengthBetween(6, 10)); // Output: false
10.10 getInitials
获取字符串中每个单词的首字母。
var name = 'John Doe';
print(name.getInitials()); // 'JD'
print(name.getInitials(initialsCount: 1)); // 'J'
print(name.getInitials(joinString: '.')); // 'J.D'
10.11 toTitleCase
将字符串转换为标题格式,首字母大写,其余小写。
'hello world'.toTitleCase(); // 'Hello World'
'hora de sair'.toTitleCase((word) => word == 'de'); // 'Hora de Sair'
10.12 toSimple
将字符串转换为简单的形式,便于比较。
String text = "Açucar";
print(text.toSimple()); // "acucar"
完整示例Demo
以下是一个完整的示例,展示了如何使用 vit_dart_extensions
包中的扩展方法:
import 'package:vit_dart_extensions/vit_dart_extensions.dart';
void main() async {
// DateTime 扩展
final dt = DateTime(2023, 1, 30, 13, 22);
print('格式化日期: ${dt.formatAsReadable()}'); // "30/01/2023 13:22"
print('仅日期: ${dt.formatAsReadable(false)}'); // "30/01/2023"
// double 扩展
double a = 4.0;
print('格式化双精度: ${a.toStringAsFixedRounded(2)}'); // "4"
// int 扩展
print('字节大小: ${1024.readableByteSize()}'); // "1 KB"
// String 扩展
String email = "example@example.com";
print('是否为电子邮件: ${email.isEmail}'); // true
// Iterable 扩展
final numbers = [1, 2, 3, 4, 5, 6];
final chunks = numbers.chunk(2);
print('分块: $chunks'); // ([1, 2], [3, 4], [5, 6])
// Map 扩展
Map<String, dynamic> json = {
'name': 'John Doe',
'age': 30,
'timestamp': '2023-01-30T13:22:00Z'
};
print('JSON格式化: ${json.prettyJSON}');
DateTime? dtFromJson = json.tryGetDateTime('timestamp');
print('从JSON获取日期: $dtFromJson');
// File 扩展
var file = File('/root/directory/file.mp3');
print('文件名: ${file.getName()}'); // 'file'
print('带扩展名的文件名: ${file.getName(true)}'); // 'file.mp3'
// Directory 扩展
var dir = Directory('some/path');
Stream<File> files = dir.listDirectoryFiles(
onDirectoryReadError: (Directory directory, Object error) {
print('读取目录时发生错误: $error');
},
);
await for (var file in files) {
print('文件: ${file.path}');
}
// List 扩展
final list = [{'name': 'John Doe', 'age': 30}, {'name': 'Jane Doe', 'age': 27}];
print('JSON格式化: ${list.prettyJSON}');
}
更多关于Flutter功能扩展插件vit_dart_extensions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter功能扩展插件vit_dart_extensions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,关于vit_dart_extensions
这个Flutter功能扩展插件的使用,下面是一个简单的代码案例来展示其基本用法。请注意,具体的插件功能和API可能会根据插件版本有所不同,因此以下代码是基于假设的插件功能编写的示例。
首先,确保你已经在pubspec.yaml
文件中添加了vit_dart_extensions
依赖:
dependencies:
flutter:
sdk: flutter
vit_dart_extensions: ^x.y.z # 替换为实际的版本号
然后,运行flutter pub get
来安装依赖。
接下来,我们来看一个如何在Flutter项目中使用vit_dart_extensions
的示例。假设这个插件提供了一些扩展函数来简化字符串操作,比如判断字符串是否为空或仅包含空白字符。
import 'package:flutter/material.dart';
import 'package:vit_dart_extensions/vit_dart_extensions.dart'; // 假设这是正确的导入路径
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('vit_dart_extensions Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Check if string is empty or whitespace:',
style: TextStyle(fontSize: 20),
),
SizedBox(height: 20),
_StringCheckerWidget(
inputString: ' ', // 示例字符串,可以改为其他值进行测试
),
],
),
),
),
);
}
}
class _StringCheckerWidget extends StatelessWidget {
final String inputString;
_StringCheckerWidget({required this.inputString});
@override
Widget build(BuildContext context) {
bool isEmptyOrWhitespace = inputString.isEmptyOrWhitespace(); // 使用vit_dart_extensions的扩展函数
return Text(
'Is the string empty or whitespace? ${isEmptyOrWhitespace ? 'Yes' : 'No'}',
style: TextStyle(fontSize: 18),
);
}
}
// 假设vit_dart_extensions提供了一个扩展函数isEmptyOrWhitespace
// 实际上,你需要查看插件的文档来确定正确的函数名称和用法
extension StringExtensions on String {
// 这里的函数是为了示例而写的,实际插件可能已经提供了这个函数
bool get isEmptyOrWhitespace {
return this == null || this.trim().isEmpty;
}
}
注意:
- 上面的
StringExtensions
扩展是为了演示目的而写的。在实际使用中,你应该查看vit_dart_extensions
的官方文档来了解它提供了哪些扩展函数。 - 如果
vit_dart_extensions
插件本身并没有提供isEmptyOrWhitespace
这样的函数,你需要根据插件的实际功能来调整代码。 - 由于
vit_dart_extensions
是一个假设的插件名称,因此具体的导入路径和API可能会有所不同。务必参考插件的官方文档和示例代码。
希望这个示例能帮助你理解如何在Flutter项目中使用功能扩展插件。如果有具体的插件功能和API疑问,建议查阅该插件的官方文档或GitHub仓库。