Flutter文件摘要计算插件file_digest的使用

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

Flutter文件摘要计算插件file_digest的使用

特性

  • 简单的API
  • 在Web平台使用Web Workers来加速解析。
  • 在其他平台使用Isolate.run。

为什么创建这个插件?

最初,它是为了在Web平台上通过Web Workers加速摘要生成。因为在主线程中解析大文件会导致应用卡顿。

示例

从Uint8List文件数据计算摘要

final Uint8List data = ...;

final String sha256 = await FileDigest(data).sha256();
final String sha512 = await FileDigest(data).sha512();

从字符串内容计算摘要

const input = 'Test content';
final String sha256 = await FileDigest.fromString(input).sha256();
final String sha512 = await FileDigest.fromString(input).sha512();

完整示例代码

以下是一个完整的示例代码,展示了如何在Flutter应用中使用file_digest插件来计算文件摘要。

import 'dart:async';

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

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

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

  // 定义输入字符串
  static const input = 'Test content';

  // 异步方法获取摘要
  Future<({String sha256, String sha512})> getDigests() async {
    return (
      sha256: await FileDigest.fromString(input).sha256(),
      sha512: await FileDigest.fromString(input).sha512(),
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: Center(
          child: SizedBox(
            width: 400,
            child: FutureBuilder(
              future: getDigests(),
              builder: (context, snapshot) {
                final data = snapshot.data;

                // 如果数据尚未加载,显示加载指示器
                if (data == null) {
                  return const CircularProgressIndicator();
                }

                // 定义文本样式
                const textStyle = (
                  label: TextStyle(fontSize: 20, fontWeight: FontWeight.w600),
                  value: TextStyle(fontSize: 14, fontWeight: FontWeight.normal),
                );

                // 构建UI
                return Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Text('SHA-256', style: textStyle.label),
                    Text(data.sha256, style: textStyle.value),
                    const SizedBox(height: 20),
                    Text('SHA-512', style: textStyle.label),
                    Text(data.sha512, style: textStyle.value),
                  ],
                );
              },
            ),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter文件摘要计算插件file_digest的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文件摘要计算插件file_digest的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用file_digest插件来计算文件摘要(哈希值)的示例代码。file_digest插件允许你计算文件的MD5、SHA-1、SHA-256等哈希值。

步骤 1: 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  file_digest: ^2.0.0  # 请确保版本号是最新的

步骤 2: 导入插件

在你的Dart文件中导入file_digest插件:

import 'package:file_digest/file_digest.dart';
import 'dart:io';

步骤 3: 计算文件摘要

下面是一个完整的示例代码,展示如何使用file_digest插件来计算文件的MD5、SHA-1和SHA-256哈希值:

import 'package:flutter/material.dart';
import 'package:file_digest/file_digest.dart';
import 'dart:io';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String md5Hash = '';
  String sha1Hash = '';
  String sha256Hash = '';

  Future<void> computeFileHashes(File file) async {
    try {
      // 计算MD5哈希值
      md5Hash = await computeMD5(file);
      
      // 计算SHA-1哈希值
      sha1Hash = await computeSHA1(file);
      
      // 计算SHA-256哈希值
      sha256Hash = await computeSHA256(file);
      
      // 更新UI
      setState(() {});
    } catch (e) {
      print('Error computing hashes: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('File Digest Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () async {
                  // 选择文件
                  FilePickerResult? result = await FilePicker.platform.pickFiles();
                  if (result != null && result.files.isNotEmpty) {
                    File file = File(result.files.first.path!);
                    // 计算文件哈希值
                    await computeFileHashes(file);
                  }
                },
                child: Text('Select File'),
              ),
              SizedBox(height: 20),
              Text('MD5: $md5Hash'),
              SizedBox(height: 10),
              Text('SHA-1: $sha1Hash'),
              SizedBox(height: 10),
              Text('SHA-256: $sha256Hash'),
            ],
          ),
        ),
      ),
    );
  }
}

注意事项

  1. 文件选择器:上面的代码使用了file_picker插件来选择文件。你需要在pubspec.yaml中添加file_picker依赖,并导入相关包。
  2. 权限:在Android和iOS上运行时,你需要确保你的应用具有访问存储的权限。

添加file_picker依赖的示例:

dependencies:
  flutter:
    sdk: flutter
  file_digest: ^2.0.0
  file_picker: ^4.0.0  # 请确保版本号是最新的

权限配置

  • Android:在android/app/src/main/AndroidManifest.xml中添加以下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  • iOS:在ios/Runner/Info.plist中添加以下权限描述(如果需要):
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
<key>UIFileSharingEnabled</key>
<true/>
<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>

确保你已经按照需要配置了权限,并根据需要调整代码以适应你的应用逻辑。

回到顶部