gpt4 book ai didi

asynchronous - Dart 中的 Stream 和 Future

转载 作者:IT王子 更新时间:2023-10-29 07:03:38 32 4
gpt4 key购买 nike

我使用基本的 async/await 已经有一段时间了,没有遇到太多问题,我想我理解它是如何工作的。不能说我是这方面的专家,但我理解它的要点。不过,我只是无法理解 Streams。在今天之前,我以为我了解它们是如何工作的(基本上就是响应式编程),但我无法让它们在 Dart 中工作。

我正在研究一个可以保存和检索 (json) 文件的持久层。我一直在使用 fileManager example作为指南。

import 'dart:io';
import 'dart:async';
import 'package:intl/intl.dart'; //date
import 'package:markdowneditor/model/note.dart';//Model
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;
import 'package:flutter/foundation.dart'; //log
import 'package:simple_permissions/simple_permissions.dart';//OS permissions

class FileManager {
static final FileManager _singleton = new FileManager._internal();

factory FileManager() {
return _singleton;
}

FileManager._internal();

Future<String> get _localPath async {
final directory = (await getApplicationDocumentsDirectory()).toString();
return p.join(directory, "notes"); //path takes strings and not Path objects
}

Future<File> writeNote(Note note) async {
var file = await _localPath;
file = p.join(
file,
DateFormat('kk:mm:ssEEEMMd').format(DateTime.now()) +
" " +
note.title); //add timestamp to title
// Write the file

SimplePermissions.requestPermission(Permission.WriteExternalStorage)
.then((value) {
if (value == PermissionStatus.authorized) {
return File(file).writeAsString('$note');
} else {
SimplePermissions.openSettings();
return null;
}
});

}

Future<List<Note>> getNotes() async {
//need file access permission on android. use https://pub.dartlang.org/packages/simple_permissions#-example-tab-
final file = await _localPath;

SimplePermissions.requestPermission(Permission.ReadExternalStorage)
.then((value) {
if (value == PermissionStatus.authorized) {
try {
Stream<FileSystemEntity> fileList =
Directory(file).list(recursive: false, followLinks: false);

// await for(FileSystemEntity s in fileList) { print(s); }
List<Note> array = [];
fileList.forEach((x) {

if (x is File) {
var res1 = ((x as File).readAsString()).then((value2) {
Note note = Note.fromJsonResponse(value2);
return note;
}).catchError((error) {
debugPrint('is not file content futurestring getNoteError: $x');
return null;
});
var array2 = res1.then((value3) {
array.add(value3);
return array;
});
//?
} else {
debugPrint('is not file getNoteError: $x');
}
});


// Add the file to the files array
//Return the Future<List<Note>>
return array;

} catch (e) {
debugPrint('getNoteError: $e');
// If encountering an error, return 0
return null;
}
} else {
SimplePermissions.openSettings();
return null;
}
});
}
}

显然它不会工作,但即使尝试使用注释掉的部分等待循环也会引发错误。

在“getNotes”中,检查权限后我想获取目录中所有文件的数组,将它们解析为 Note 对象并返回结果数组。

我得到文件列表:

Stream<FileSystemEntity> fileList =
Directory(file).list(recursive: false, followLinks: false);

对于流中的每一个,我想将文件解析为一个对象并将其附加到数组以在最后返回。

       List<Note> array = [];
fileList.forEach((x) {

if (x is File) {
var res1 = ((x as File).readAsString()).then((value2) {
Note note = Note.fromJsonResponse(value2);
return note;
}).catchError((error) {
debugPrint('is not file content futurestring getNoteError: $x');
return null;
});
var array2 = res1.then((value3) {
array.add(value3);
return array;
});
//?
} else {
debugPrint('is not file getNoteError: $x');
}
});


// Add the file to the files array
//Return the Future<List<Note>>
return array;

最佳答案

Stream.forEach() 返回一个 Future。您的最后一个 return 语句在 for-each 调用之后立即运行,但应该 await 它。

await fileList.forEach((x) {
...

https://api.dartlang.org/stable/2.2.0/dart-async/Stream/forEach.html

关于asynchronous - Dart 中的 Stream 和 Future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55781015/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com