Flutter功能扩展插件vit_dart_extensions的使用

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

Flutter功能扩展插件vit_dart_extensions的使用

vit_dart_extensions 是一个Dart包,提供了一系列扩展方法,用于增强各种数据类型(如 intStringDateTimeMap 等)的功能。这些扩展方法旨在与现有的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

1 回复

更多关于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;
  }
}

注意

  1. 上面的StringExtensions扩展是为了演示目的而写的。在实际使用中,你应该查看vit_dart_extensions的官方文档来了解它提供了哪些扩展函数。
  2. 如果vit_dart_extensions插件本身并没有提供isEmptyOrWhitespace这样的函数,你需要根据插件的实际功能来调整代码。
  3. 由于vit_dart_extensions是一个假设的插件名称,因此具体的导入路径和API可能会有所不同。务必参考插件的官方文档和示例代码。

希望这个示例能帮助你理解如何在Flutter项目中使用功能扩展插件。如果有具体的插件功能和API疑问,建议查阅该插件的官方文档或GitHub仓库。

回到顶部