Flutter综合工具插件comprehensive_utils的使用

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

Flutter综合工具插件 comprehensive_utils 的使用

特性

Widgets

  • FluentListView: 提供流畅的列表视图。

Tools

  • IndexingCollection<T>: 索引集合工具。
  • ObservableTimer: 可观察的定时器。
  • CacheManager: 缓存管理工具。

Streams

  • DistinctSubject: 一个特殊的主题,只在值发生变化时发出新值。
  • DistinctValueStream: 一个特殊的流,确保连续相同的值不会重复发送。
  • DistinctConnectableStream: 连接多个流并确保只有不同的值会被转发。

Extensions

Stream 扩展

  • publishDistinctValue
  • publishDistinctValueSeeded
  • shareDistinctValue
  • shareDistinctValueSeeded
  • mapDistinctValue<T>
  • takeUntilFuture

Iterable 扩展

  • parseList<T>
  • parseIterable<T>

Function 扩展

  • apply

快速开始

首先,在您的项目中添加包依赖,并导入包:

import 'package:comprehensive_utils/comprehensive_utils.dart';

使用示例

以下是如何使用 DistinctSubject 来监控用户名变化的例子。这个例子展示了如何创建一个只在值变化时才会更新的流。

final DistinctSubject<String> _userNameSubject = DistinctSubject<String>();

// 获取用户名称流
DistinctValueStream<String> get userNameStream => _userNameSubject.stream;

void changeUserName(String userName) {
  // 如果新值与前一个值不同,则将新值添加到流中
  _userNameSubject.add(userName);
}

// 监听用户名的变化
@override
void initState() {
  super.initState();
  // 订阅用户名流
  userNameStream.listen((newUserName) {
    print('User name changed to: $newUserName');
  });
}

完整示例 Demo

下面是一个完整的Flutter应用示例,演示了如何结合使用 comprehensive_utils 中的不同组件来构建一个简单的用户名变更通知系统。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Comprehensive Utils Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: UserNameChangePage(),
    );
  }
}

class UserNameChangePage extends StatefulWidget {
  @override
  _UserNameChangePageState createState() => _UserNameChangePageState();
}

class _UserNameChangePageState extends State<UserNameChangePage> {
  final DistinctSubject<String> _userNameSubject = DistinctSubject<String>();
  String currentUserName = "Guest";

  @override
  void initState() {
    super.initState();
    // 订阅用户名流
    _userNameSubject.stream.listen((newUserName) {
      setState(() {
        currentUserName = newUserName;
      });
    });
  }

  void _changeUserName(String newName) {
    if (_userNameSubject.value != newName) {
      _userNameSubject.add(newName);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("User Name Change"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Current User Name: $currentUserName'),
            Padding(
              padding: const EdgeInsets.all(16.0),
              child: TextField(
                onSubmitted: _changeUserName,
                decoration: InputDecoration(labelText: 'Enter new user name'),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

此代码片段展示了如何通过输入新的用户名来触发状态更新,并且只有当新用户名不同于当前用户名时,才会触发UI更新。这利用了DistinctSubject的独特功能,以避免不必要的UI刷新。


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

1 回复

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


当然,以下是如何在Flutter项目中使用comprehensive_utils插件的示例代码。comprehensive_utils是一个综合工具插件,提供了一系列实用的功能,比如字符串处理、日期处理、设备信息等。为了简洁起见,这里只展示几个常用功能的代码示例。

1. 添加依赖

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

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

然后运行flutter pub get来获取依赖。

2. 导入插件

在你需要使用该插件的Dart文件中导入它:

import 'package:comprehensive_utils/comprehensive_utils.dart';

3. 使用示例

字符串处理

void handleStrings() {
  String original = "Hello, World!";
  
  // 转换为大写
  String upperCase = StringUtils.toUpperCase(original);
  print("Uppercase: $upperCase");
  
  // 转换为小写
  String lowerCase = StringUtils.toLowerCase(original);
  print("Lowercase: $lowerCase");
  
  // 反转字符串
  String reversed = StringUtils.reverse(original);
  print("Reversed: $reversed");
}

日期处理

void handleDates() {
  DateTime now = DateTime.now();
  
  // 获取当前日期字符串(yyyy-MM-dd)
  String dateString = DateUtils.formatDate(now, "yyyy-MM-dd");
  print("Date String: $dateString");
  
  // 获取当前时间字符串(HH:mm:ss)
  String timeString = DateUtils.formatDate(now, "HH:mm:ss");
  print("Time String: $timeString");
  
  // 获取当前日期时间的完整字符串
  String dateTimeString = DateUtils.formatDate(now, "yyyy-MM-dd HH:mm:ss");
  print("Date Time String: $dateTimeString");
}

设备信息

void handleDeviceInfo() {
  // 获取设备信息
  DeviceInfo deviceInfo = DeviceUtils.getDeviceInfo();
  
  print("Brand: ${deviceInfo.brand}");
  print("Model: ${deviceInfo.model}");
  print("Android ID: ${deviceInfo.androidId}");
  print("System Version: ${deviceInfo.systemVersion}");
  print("Screen Width: ${deviceInfo.screenWidth}px");
  print("Screen Height: ${deviceInfo.screenHeight}px");
}

4. 在主函数中调用

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('comprehensive_utils Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () {
                  handleStrings();
                },
                child: Text('Handle Strings'),
              ),
              ElevatedButton(
                onPressed: () {
                  handleDates();
                },
                child: Text('Handle Dates'),
              ),
              ElevatedButton(
                onPressed: () {
                  handleDeviceInfo();
                },
                child: Text('Handle Device Info'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

这个示例展示了如何在Flutter项目中导入并使用comprehensive_utils插件的字符串处理、日期处理和设备信息功能。你可以根据需求进一步扩展这些功能。注意,具体的API和方法可能根据插件版本的不同有所变化,请参考插件的官方文档获取最新信息。

回到顶部