Flutter多功能工具插件utility_library的使用

Flutter多功能工具插件utility_library的使用

功能库

utility_library 是一个包含 Dart 扩展和实用程序的综合集合,可以为您的 Flutter 应用程序增加额外的功能,如高级数字、日期和字符串操作。

特性

  • 颜色实用程序
  • 数字格式化和验证扩展
  • 日期和时间格式化及计算
  • 字符串变换和检查
  • 集合的唯一性和 JSON 转换功能

安装

要在项目中使用 utility_library,请将其添加到 pubspec.yaml 文件中的依赖项:

dependencies:
  utility_library: ^1.0.0

然后运行以下命令:

flutter pub get

使用

导入库

在 Dart 文件中添加以下导入语句:

import 'package:utility_library/utility_library.dart';

颜色实用程序

设置应用程序的主要和次要颜色:

AppColors.primaryColor = Color(0xff02a4ff); // 您的应用程序主要颜色
AppColors.secondaryColor = Color(0xffffffff); // 您的应用程序次要颜色

JSON 扩展

您可以使用接口或抽象类,具有实例方法 toJson 和工厂或常规方法 fromJson。这里是一个改进的方法:

User user = User(name: 'Alice', age: 28);
String userJson = serialize(user);
print('Serialized User: $userJson');

User deserializedUser = deserialize<User>(userJson, User.fromJson);
print('Deserialized User: ${deserializedUser.name}');

数字扩展

格式化和检查数字:

double myNumber = 123.456;
print(myNumber.reFormat(formatDigits: '000', asFixedNumber: 3)); // 使用扩展方法

日期时间扩展

轻松处理日期时间格式化:

DateTime now = DateTime.now();
print('标准日期时间: ${now.format(pattern: PredefinedDateFormats.standardDateTime.pattern)}');
print('仅日期: ${now.format(pattern: PredefinedDateFormats.dateOnly.pattern)}');
print('仅时间: ${now.format(pattern: PredefinedDateFormats.timeOnly.pattern)}');
print('自定义日期时间: ${now.format(pattern: PredefinedDateFormats.customDateTime.pattern)}');
print('详细日期时间带星期几: ${now.format(pattern: PredefinedDateFormats.verboseDateTimeWithDayOfWeek.pattern)}');
print('年和完整月份: ${now.format(pattern: PredefinedDateFormats.yearAndFullMonth.pattern)}');

日期时间实用程序扩展

轻松处理日期时间格式化:

DateTime today = DateTime.now();
print('今天是 ${today.isLeapYear ? "闰年" : "非闰年"}。');
print('当前月份的天数: ${today.daysInMonth}');
print('今天是否是一年的开始? ${today.isStartOfYear}');
print('今天是否是一年的结束? ${today.isEndOfYear}');
print('距离今年结束还有多少天: ${today.daysToEndOfYear}');
print('今天是否是周末? ${today.isWeekend}');

其他实用程序

  • 检查闰年、日期计算、周末检查。
  • 双精度和整数的验证和格式化。
  • 字符串操作,如首字母大写、回文检查和 Base64 转换。
  • 列表的唯一性和 JSON 转换。

示例

以下是如何在 Flutter 应用程序中使用这些实用程序的示例:

// 示例用法
void main() {
  // 初始化并使用颜色
  AppColors.primaryColor = Color(0xff02a4ff);
  AppColors.secondaryColor = Color(0xffffffff);

  // 使用扩展
  DateTime today = DateTime.now();
  print('今天是 ${today.isLeapYear ? "闰年" : "非闰年"}。');
}

// 示例用法
Text(widget.title, style: TextStyle(color: AppColors.secondaryColor))

示例代码

以下是完整的示例代码,展示了如何使用 utility_library 中的各种功能:

import 'package:example/json_serializable.dart';
import 'package:flutter/material.dart';
import 'package:utility_library/utils/color_utils.dart';
import 'package:utility_library/utils/date_time_utils.dart';
import 'package:utility_library/utils/extension_utils.dart';
import 'package:utility_library/utils/num_extensions.dart';
import 'package:utility_library/utils/predefined_date_formats.dart';
import 'package:utility_library/utils/json_extensions.dart';

void main() {
  runApp(const MyApp());

  /// json_extensions.dart
  User user = User(name: 'Alice', age: 28);
  String userJson = serialize(user);
  print('序列化的用户: $userJson');

  User deserializedUser = deserialize<User>(userJson, User.fromJson);
  print('反序列化的用户: ${deserializedUser.name}');

  /// color_utils.dart
  AppColors.primaryColor = Color(0xff02a4ff); /// 您的应用程序主要颜色
  AppColors.secondaryColor = Color(0xffffffff); /// 您的应用程序次要颜色

  /// num_extensions.dart
  double myNumber = 123.456;
  print(myNumber.reFormat(formatDigits: '000', asFixedNumber: 3));  // 使用扩展方法

  /// predefined_date_formats.dart
  DateTime nowFormats = DateTime.now();

  print('标准日期时间: ${nowFormats.format(pattern: PredefinedDateFormats.standardDateTime.pattern)}');
  print('仅日期: ${nowFormats.format(pattern: PredefinedDateFormats.dateOnly.pattern)}');
  print('仅时间: ${nowFormats.format(pattern: PredefinedDateFormats.timeOnly.pattern)}');
  print('自定义日期时间: ${nowFormats.format(pattern: PredefinedDateFormats.customDateTime.pattern)}');
  print('详细日期时间带星期几: ${nowFormats.format(pattern: PredefinedDateFormats.verboseDateTimeWithDayOfWeek.pattern)}');
  print('年和完整月份: ${nowFormats.format(pattern: PredefinedDateFormats.yearAndFullMonth.pattern)}');

  /// date_time_utils.dart
  // 对于 DateTime
  print('--- 对于 DateTime');  // 分隔符,便于阅读
  DateTime today = DateTime.now();

  print('今天是 ${today.isLeapYear ? "闰年" : "非闰年"}。');
  print('当前月份的天数: ${today.daysInMonth}');
  print('今天是否是一年的开始? ${today.isStartOfYear}');
  print('今天是否是一年的结束? ${today.isEndOfYear}');
  print('距离今年结束还有多少天: ${today.daysToEndOfYear}');
  print('今天是否是周末? ${today.isWeekend}');

  /// extension_utils.dart
  // 对于 double
  print('--- 对于 double');  // 分隔符,便于阅读
  List<double> numbersDouble = [3.14159, double.nan, double.infinity, -0.98765];

  for (var number in numbersDouble) {
    print('处理数字: $number');
    print('字符串或空: ${number.toStringOrNull()}');
    print('数字是否有效? ${number.isValid}');
    print('固定到两位小数: ${number.toFixedOrNull(2)}');
    print('---');  // 分隔符,便于阅读
  }

  // 对于 int
  print('--- 对于 int');  // 分隔符,便于阅读
  List<int> numbersInt = [10, -5, 0, 1, 13];

  for (var number in numbersInt) {
    print('处理数字: $number');
    print('是否为偶数: ${number.isEven}');
    print('是否为奇数: ${number.isOdd}');
    print('阶乘: ${number.factorial}');
    print('是否为质数: ${number.isPrime}');
    print('二进制表示: ${number.toBinary}');
    print('十六进制表示: ${number.toHex}');
    print('---');  // 分隔符,便于阅读
  }

  // 对于 String
  print('--- 对于 String');  // 分隔符,便于阅读
  List<String> textsString = ['hello world', '123', 'A man a plan a canal panama', 'Flutter.dev'];

  for (var text in textsString) {
    print('处理文本: "$text"');
    print('是否为纯数字: ${text.isNumeric}');
    print('首字母大写: ${text.toTitleCase}');
    print('反转: ${text.reversed}');
    print('是否为回文: ${text.isPalindrome}');
    if (text.isNumeric) {
      print('Base64编码: ${text.toBase64}');
      print('从Base64解码: ${text.toBase64.fromBase64()}');
    }
    print('---');  // 分隔符,便于阅读
  }

  // 对于 List<T>
  print('--- 对于 List<T>');  // 分隔符,便于阅读
  List<int> numbers = [1, 2, 3, 3, 4];
  List<String> words = ["apple", "banana", "apple", "cherry"];

  // 使用扩展
  print('数字(非空): ${numbers.nonNull}');
  print('单词(反转): ${words.reversed}');
  print('数字是否唯一? ${numbers.isUnique}');
  print('单词是否唯一? ${words.isUnique}');
  print('单词的JSON字符串: ${words.toJsonString()}');

  // 将数字转换为字符串
  List<String> stringNumbers = numbers.transform((n) => 'Number $n');
  print('转换后的数字: $stringNumbers');
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // 这个小部件是您的应用的根。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // 这是您的应用的主题。
        //
        // 尝试这样做:运行您的应用,您会看到应用有一个蓝色的工具栏。然后,在不退出应用的情况下,
        // 尝试将 colorScheme 中的 seedColor 改为 Colors.green,并触发热重载(保存更改或按 IDE 中的 "热重载" 按钮,或在控制台中按 "r")。
        //
        // 注意:计数器没有重置回零;应用状态在重载时不会丢失。要重置状态,使用热重启。
        //
        // 这对代码也适用,不仅仅是值:大多数代码更改都可以通过热重载来测试。
        colorScheme: ColorScheme.fromSeed(seedColor: AppColors.primaryColor),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  // 这个小部件是您的应用的主页。它是有状态的,这意味着它有一个 State 对象(定义在下面),该对象包含影响其外观的字段。
  // 
  // 这个类是状态的配置。它保存了由父级(本例中为 App 小部件)提供的值(在这种情况下是标题),并在构建方法中使用这些值。
  // 小部件子类中的字段总是标记为 "final"。

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      // 这次调用 setState 告诉 Flutter 框架某些事情已经改变,这会导致它重新运行构建方法以反映更新的值。
      // 如果我们不调用 setState() 而只是改变 _counter,那么构建方法就不会再次被调用,因此看起来什么也不会发生。
      _counter++;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 每次调用 setState 方法时都会重新运行此方法。
    //
    // Flutter 框架已针对快速重新运行构建方法进行了优化,这样您就可以重建任何需要更新的小部件,而不是个别地改变实例。
    return Scaffold(
      appBar: AppBar(
        // 尝试这样做:在这里更改颜色(例如,更改为 Colors.amber),并触发热重载,看看工具栏的颜色改变,而其他颜色保持不变。
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        // 这里我们从 MyHomePage 对象中获取值,该对象是由 App.build 方法创建的,并用于设置我们的应用栏标题。
        title: Text(widget.title, style: TextStyle(color: AppColors.secondaryColor)),
      ),
      body: Center(
        // Center 是一个布局小部件。它接受单个子元素并将其放置在父元素的中间。
        child: Column(
          // Column 也是一个布局小部件。它接受一个子元素列表并垂直排列它们。
          // 默认情况下,它会根据其子元素水平调整大小,并尝试与父元素一样高。
          //
          // Column 有许多属性可以控制其大小和子元素的位置。这里我们使用 mainAxisAlignment 来垂直居中子元素;
          // 主轴在这里是垂直的(交叉轴将是水平的)。
          //
          // 尝试这样做:启用“调试绘制”(选择 IDE 中的“切换调试绘制”动作,或在控制台中按 “p”),可以看到每个小部件的线框图。
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text(
              '您已经按下按钮次数:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: '增加',
        child: const Icon(Icons.add),
      ), // 这个逗号使得自动格式化更美观。
    );
  }
}

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

1 回复

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


utility_library 是一个多功能的 Flutter 插件,旨在为开发者提供一系列常用的工具和功能,以简化开发过程。这个插件通常包含各种实用工具,如网络请求、本地存储、日期时间处理、字符串操作等。使用 utility_library 可以帮助你减少重复代码,提高开发效率。

安装 utility_library

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

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

然后运行 flutter pub get 来安装依赖。

使用 utility_library

以下是一些常见的使用场景和示例:

1. 网络请求

utility_library 可能包含一个简化的网络请求工具,类似于 http 包,但更易于使用。

import 'package:utility_library/utility_library.dart';

void fetchData() async {
  var response = await UtilityLibrary.get('https://jsonplaceholder.typicode.com/posts');
  if (response.statusCode == 200) {
    print('Data: ${response.body}');
  } else {
    print('Failed to load data');
  }
}

2. 本地存储

utility_library 可能提供了简化的本地存储功能,类似于 shared_preferences 包。

import 'package:utility_library/utility_library.dart';

void saveData() async {
  await UtilityLibrary.saveString('key', 'value');
}

void getData() async {
  String value = await UtilityLibrary.getString('key');
  print('Value: $value');
}

3. 日期时间处理

utility_library 可能包含一些日期时间处理的工具函数。

import 'package:utility_library/utility_library.dart';

void formatDate() {
  DateTime now = DateTime.now();
  String formattedDate = UtilityLibrary.formatDate(now, 'yyyy-MM-dd');
  print('Formatted Date: $formattedDate');
}

4. 字符串操作

utility_library 可能提供了常见的字符串操作工具。

import 'package:utility_library/utility_library.dart';

void manipulateString() {
  String text = 'Hello, World!';
  bool contains = UtilityLibrary.contains(text, 'World');
  print('Contains "World": $contains');
}

5. 其他工具

utility_library 可能还包含其他实用工具,如设备信息、权限请求、文件操作等。

import 'package:utility_library/utility_library.dart';

void getDeviceInfo() async {
  String deviceModel = await UtilityLibrary.getDeviceModel();
  print('Device Model: $deviceModel');
}
回到顶部