如何使用 Flutter "saf" 包进行文件操作(create/write/update/delete 文件)

How to do file operations (create/write/update/delete files) using the Flutter "saf" Package

如何使用 Flutter "saf" 包进行文件操作(create/write/update/delete 个文件)。

link:- pub.dev/packages/saf

我在 Google 上没有找到任何解决方案。我想使用 Android“存储访问框架”并让用户 select 外部存储上的文件夹。在此文件夹中,我想保存用户可以访问的我的应用程序文件。

以前我使用的是应用专用存储 (Android/data/com.myapp)。但由于 Google 的安全更新,11 位用户无法访问此文件夹。

任何解决方案将不胜感激。提前致谢。

bool? isGranted = await saf.getDirectoryPermission(isDynamic: false);

if (isGranted != null && isGranted) {
  // Perform some file operations
  // **But How?**
} else {
  // failed to get the permission
}

检查这个 Link SAF 仅用于权限处理。写、读操作由dart执行。

找到正确的本地路径

Future<String> get _localPath async {
 final directory = await getApplicationDocumentsDirectory();
 return directory.path;
  }

创建对文件位置的引用

Future get _localFile async { final path = await _localPath; return File('$path/counter.txt'); }

** 将数据写入文件**

Future writeCounter(int counter) async { final file = await _localFile;

// Write the file return file.writeAsString('$counter'); }

首先使用saf flutter package获取待操作目录的权限


import 'package:saf/saf.dart';

await Saf.getDynamicDirectoryPermission()

Flutter中使用dart的文件操作:io核心包

创建

var myFile = File('file.txt');

阅读

File('file.txt').readAsString().then((String contents) {
    print(contents);
  });

写入

final filename = 'file.txt';
var file = await File(filename).writeAsString('some content');

删除

var myFile = File('file.txt');
myFile.delete();

来源: https://api.dart.dev/stable/2.16.1/dart-io/File-class.html

如果您使用存储访问框架获得文件夹访问权限,则无法使用 dart: 'dart: io' 程序包对此文件夹执行文件处理操作。 检查 URL: 此外,从 Android 11 及更高版本开始,在没有 MANAGE_EXTERNAL_STORAGE 许可的情况下,几乎完全不推荐使用 java.io.File 从外部存储访问数据。

我在flutter中找到了两个支持Storage Access Framework的Package

shared_storage: ^0.2.0

saf: ^1.0.3+3

shared_storage 0.2.0 提供给我们

Uri uri = await openDocumentTree(); 
List<UriPermission> persistedUris = await persistedUriPermissions();

/// Create a new file using the `SAF` API
final newDocumentFile = await createDocumentFile(
  mimeType: 'text/plain',
  content: 'My Plain Text Comment Created by shared_storage plugin',
  displayName: 'CreatedBySharedStorageFlutterPlugin',
  directory: anySelectedUriByTheOpenDocumentTreeAPI,
);

print(newDocumentFile);

通过上述方法可以使用writeAsString()而不是writeAsBytes()来创建文件。但是为了创建 Image 文件,我们需要 writeAsBytes().

saf 1.0.3+3 在 document_file.dart 中有方法 createFileAsBytes() 但在当前版本中不可用。

但在未来,这两个包都会提供这些 API。

解法: 目前,我已经通过同时使用这两个包解决了这个问题。

在您的pubspec.yaml中添加软件包:

shared_storage: ^0.2.0

saf: ^1.0.3+3

并使用下面的代码

void createFileBySAF(String fileName, Uint8List uint8list) {

  /*From: shared_storage: ^0.2.0*/
  Uri uri = await openDocumentTree(); 
  
  /*From: saf: ^1.0.3+3*/
  Map<String, dynamic> result = await MethodChannel('com.ivehement.plugins/saf/documentfile').invokeMapMethod<String, dynamic>('createFile', <String, dynamic>{
    'mimeType': 'any',
    'content': uint8list,
    'displayName': fileName,
    'directoryUri': '$uri',
  });
  print(result);
}

对于更新和删除操作,请在 https://github.com/ivehement/saf/blob/master/lib/src/storage_access_framework/document_file.dart

中找到用法