来自flutter doc:
class CounterStorage {
Future<String> get _localPath async {
final directory = await getApplicationDocumentsDirectory();
return directory.path;
}
Future<File> get _localFile async {
final path = await _localPath;
return File('$path/counter.txt');
}
Future<int> readCounter() async {
try {
final file = await _localFile;
// Read the file
String contents = await file.readAsString();
return int.parse(contents);
} catch (e) {
// If we encounter an error, return 0
return 0;
}
}
Future<File> writeCounter(int counter) async {
final file = await _localFile;
// Write the file
return file.writeAsString('$counter');
}
}
readCounter()
和writeCounter()
每次都被调用_localPath
getter。我的问题是:
这有点浪费吗?等待
_localFile
的构造函数中的CounterStorage
并将其存储在类成员中,而不是每次都获取_localPath
和_localPath
会更好吗?有人可以建议这样的实现吗?
最佳答案
这取决于您的意思是浪费,以及getApplicationDocumentsDirectory
的约定。
例如,如果getApplicationDocumentsDirectory()
在下一次调用时有可能返回不同的路径(例如,如果新用户登录,可能-我不确定详细信息),那么这是完全正确的。
如果可以保证该值永远不变,则可以进行进一步优化,但是显示优化可能不是示例文档的目标。如果您有兴趣,我可以想到两个想法:
创建一个static final
字段:
class CounterStorage {
// Static fields in Dart are lazy; this won't get sent until used.
static final _localPath = getApplicationDocumentsDirectory().then((p) => p.path);
// ...
}
如果
CounterStorage
具有其他在不等待_localPath
解析的情况下非常有用的方法或字段,这是我的偏爱。在上面的示例中,没有任何示例,因此我希望:创建
static
async
方法以创建CounterStorage
import 'package:meta/meta.dart';
class CounterStorage {
// You could even combine this with the above example, and make this a
// static final field.
static Future<CounterStorage> resolve() async {
final localPath = await getApplicationDocumentsDirectory();
return new CounterStorage(new File(this.localPath));
}
final File _file;
// In a test you might want to use a temporary directory instead.
@visibleForTesting
CounterStorage(this._file);
Future<int> readCount() async {
try {
final contents = await _file.readAsString();
return int.parse(contents);
} catch (_) {
return 0;
}
}
}
这使得每个应用程序检索
File
的过程可能发生一次。关于dart - 以下Flutter读取/写入文件文档是否存在浪费的实现?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51254753/