Flutter实用扩展功能插件handy_extensions的使用

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

Flutter实用扩展功能插件handy_extensions的使用

简介

HandyExtensions 是一个由 Ngonidzashe Mangudya 开发的 Flutter 插件,它为 Flutter 的核心库提供了许多便捷的扩展方法,使开发更加高效和简洁。

特性

  • BuildContext 扩展:导航、显示 SnackBar、获取屏幕尺寸等。
  • String 扩展:转换为大写、小写、首字母大写、获取国家 emoji 等。
  • int 扩展:生成 Duration 对象。
  • List 扩展:分区、随机选择、分组、交换元素等。
  • Map 扩展:交换键值对、复制、移除空值等。
  • Nullable 扩展:检查变量是否为空、转换为字符串等。

安装

pubspec.yaml 文件中添加依赖:

dependencies:
  handy_extensions: ^<version>

使用示例

BuildContext 扩展

导航到新页面

context.goTo(page: const Home());

替换当前页面并导航

context.goTo(page: const Home(), replace: true);

返回上一页

context.goBack();

导航并清除历史记录

context.goToRefresh(page: const Login());

显示 SnackBar

context.notify(message: 'Hello World', isError: false);

获取屏幕尺寸

double screenHeight = context.height;
double screenWidth = context.width;

String 扩展

获取国家 emoji

String country = 'ZW';
String emoji = country.countryEmoji; // 🇿🇼

转换为标题格式

String title = 'hello world';
String titleCase = title.titleCase; // Hello world

转换为标题格式(每个单词首字母大写)

String heading = 'hello world';
String headingCase = heading.headingCase; // Hello World

转换为 double 或 null

String? number = '1';
double? doubleNumber = number.doubleOrNull; // 1.0

转换为 int 或 null

String? number = '1';
int? intNumber = number.intOrNull; // 1

Map 扩展

交换键值对

Map<String, int> map = {'a': 1, 'b': 2};
Map<int, String> swappedMap = map.swap; // {1: 'a', 2: 'b'}

复制 Map

Map<String, int> map = {'a': 1, 'b': 2};
Map<String, int> copiedMap = map.copy; // {'a': 1, 'b': 2}

移除空值

Map<String, int?> map = {'a': 1, 'b': null};
Map<String, int?> cleanedMap = map.removeNulls; // {'a': 1}

调整顺序

Map<String, int> map = {'a': 1, 'b': 2};
Map<String, int> adjustedMap = map.adjustOrder(1, 0); // {'b': 2, 'a': 1}

List 扩展

分区

List<List<int>> partitioned = [1, 2, 3, 4, 5, 6].partition(chunkSize: 3); // [[1, 2, 3], [4, 5, 6]]

随机选择一个元素

String randomItem = ["Hello", "World", "iAMNGONI"].randomItem(); // 随机返回一个元素

随机选择多个元素

List<String> randomItems = ["Hello", "World", "iAMNGONI"].randomItems(count: 2); // 随机返回两个元素

查找第一个符合条件的元素

List<String> list = ['a', 'b', 'c'];
String? character = list.firstWhereOrNull((String item) => item == 'a'); // 'a'

按条件分组

Map<bool, List<int>> grouped = [1, 2, 3, 4, 5, 6].groupBy((i) => i % 2 == 0); // {true: [2, 4, 6], false: [1, 3, 5]}

交换元素

List<int> list = [1, 2, 3, 4, 5];
list.swap(0, 4); // [5, 2, 3, 4, 1]

交换范围内的元素

List<int> list = [1, 2, 3, 4, 5];
list.swapRange(0, 2, 3); // [4, 5, 3, 1, 2]

检查是否有重复元素

List<int> list = [1, 2, 3, 4, 5, 1];
bool hasDuplicates = list.hasDuplicates; // true

插入分隔符

List<int> list = [1, 2, 3, 4, 5, 1];
List<int> interspersed = list.intersperse(100); // [1, 100, 2, 100, 3, 100, 4, 100, 5, 100, 1]

更新符合条件的元素

List<int> numbers = [1, 2, 3, 4, 5];
numbers.updateWhere(
  (n) => n.isEven,  // 条件
  (n) => n * 2,     // 更新函数
);
// [1, 4, 3, 8, 5]

// 适用于任何类型
List<String> words = ['hello', 'world', 'dart'];
words.updateWhere(
  (s) => s.length <= 4,
  (s) => s.toUpperCase(),
);
// ['HELLO', 'world', 'DART']

Int 扩展

生成微秒 Duration

Duration microsecond = 1.microsecond; // 1 微秒

生成毫秒 Duration

Duration milliseconds = 1.milliseconds; // 1 毫秒

生成秒 Duration

Duration seconds = 1.seconds; // 1 秒

生成分钟 Duration

Duration minutes = 1.minutes; // 1 分钟

生成小时 Duration

Duration hours = 1.hours; // 1 小时

生成天数 Duration

Duration days = 1.days; // 1 天

生成周数 Duration

Duration weeks = 1.weeks; // 1 周

组合使用 Duration

Duration duration = 1.weeks + 2.days + 3.hours + 4.minutes + 5.seconds + 6.milliseconds + 7.microseconds;

通用扩展

检查变量是否为空

String? name = null;
bool isNull = name.isNull; // true

Nullable Int 扩展

检查是否为整数

int? number = 1;
bool isInt = number.isInt; // true

int? number = null;
bool isInt = number.isInt; // false

Nullable String 扩展

检查是否为字符串

String? name = 'Ngoni';
bool isString = name.isString; // true

String? name = null;
bool isString = name.isString; // false

如果为空则返回空字符串

String? name = null;
String emptyName = name.orEmpty; // ''

String? name = 'Ngoni';
String nonEmptyName = name.orEmpty; // 'Ngoni'

检查是否真的不为空

String? name = null;
bool isNotReallyEmpty = name.isNotReallyEmpty; // false

String? name = ' ';
bool isNotReallyEmpty = name.isNotReallyEmpty; // false

String? name = 'Ngoni';
bool isNotReallyEmpty = name.isNotReallyEmpty; // true

其他信息

你可以根据需要添加更多的扩展方法,并与社区分享。


希望这些示例能帮助你更好地理解和使用 handy_extensions 插件。如果你有任何问题或建议,欢迎随时提出!


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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用handy_extensions插件的示例代码。handy_extensions是一个提供多种实用功能的Flutter插件,可以帮助开发者快速实现一些常见的功能,比如字符串操作、日期时间处理、集合操作等。

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

dependencies:
  flutter:
    sdk: flutter
  handy_extensions: ^最新版本号  # 请替换为最新版本号

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

下面是一些使用handy_extensions插件的示例代码:

1. 字符串操作

import 'package:flutter/material.dart';
import 'package:handy_extensions/handy_extensions.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Handy Extensions Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Original String: Hello, World!',
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 20),
              Text(
                'Reversed String: ${"Hello, World!".reverse()}',
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 20),
              Text(
                'Camel Case String: ${"hello_world!".toCamelCase()}',
                style: TextStyle(fontSize: 20),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

2. 日期时间处理

import 'package:flutter/material.dart';
import 'package:handy_extensions/handy_extensions.dart';
import 'package:intl/intl.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    DateTime now = DateTime.now();
    
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Handy Extensions DateTime Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Current Date: ${DateFormat('yyyy-MM-dd').format(now)}',
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 20),
              Text(
                'Days in Month: ${now.daysInMonth}',
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 20),
              Text(
                'Is Leap Year: ${now.isLeapYear}',
                style: TextStyle(fontSize: 20),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

3. 集合操作

import 'package:flutter/material.dart';
import 'package:handy_extensions/handy_extensions.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Handy Extensions List Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Original List: $numbers',
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 20),
              Text(
                'Reversed List: ${numbers.reversed()}',
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 20),
              Text(
                'Chunk List (size 3): ${numbers.chunk(3)}',
                style: TextStyle(fontSize: 20),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

请注意,这些代码示例仅展示了handy_extensions插件的一部分功能。你可以查阅该插件的官方文档来获取更多信息和功能示例。

回到顶部