#flutter #dart #file-io
Вопрос:
У меня есть страница, которая записывает цвет в файл, называется «colors.txt».Затем страница закрывается, когда она будет открыта снова, этот файл будет прочитан, и его содержимое ( String
) будет напечатано на экране.
Это класс, который обрабатывает операции чтения и записи :
class Pathfinder {
Future<String> get _localPath async {
final directory = await getApplicationDocumentsDirectory();
return directory.path;
}
Future<File> get _localFile async {
final path = await _localPath;
return File('$path/colors.txt');
}
Future<File> writeColor(String color) async {
final file = await _localFile;
// Write the file
return file.writeAsString('$color');
}
Future<String> readColor() async {
try {
final file = await _localFile;
// Read the file
final contents = await file.readAsString();
return contents;
} catch (e) {
// If encountering an error, return 0
return "Error while reading colors";
}
}
}
Перед закрытием страницы цвет был сохранен writeColor
, нам просто нужно прочитать файл и распечатать его содержимое.
И вот как я читаю цвет :
void initState() {
super.initState();
String colorRead;
() async {
pf = new Pathfinder();
colorRead = await pf.readColor();
}();
print("Color in initState: " colorRead.toString());
}
Проблема в том, что colorRead
так бывает всегда null
. Я уже пытался .then()
, .whenCompleted()
но ничего не изменилось.
Поэтому я сомневаюсь : правильно ли я жду операции чтения или файл по каким-то причинам удаляется при закрытии страницы?
Я думаю, что если бы файл не существовал, то readColor
должен был бы выдать ошибку.
ИЗМЕНИТЬ : Как writeColor
это называется :
Color bannerColor;
//some code
await pf.writeColor(bannerColor.value.toRadixString(16));
Комментарии:
1. Не могли бы вы поделиться кодом, как вы звоните
writeColor
?2. @SamChan готово, это в разделе редактирования
Ответ №1:
void initState() {
super.initState();
String colorRead;
() async {
pf = new Pathfinder();
colorRead = await pf.readColor();
}();
print("Color in initState: " colorRead.toString()); /// << this will execute before the async code in the function is executed
}
Это значение равно null из-за того, как работает асинхронность/ожидание. Оператор печати будет вызван до того, как анонимная асинхронная функция завершит выполнение. Если вы печатаете внутри функции, вы должны увидеть цвет, если все остальное работает правильно.
Комментарии:
1. Решено! Но не могли бы вы рассказать мне больше? Я думал, что асинхронность будет следовать потоку, обновлять colorRead, а затем печатать. Почему печать вызывается до асинхронности?
2. Поэтому, когда вы выполняете эту анонимную функцию, она будет выполняться первой, но она нажмет
await
(colorRead = await pf.readColor();
), которая ставит в очередь работу для следующего прохода в цикле выполнения для изолированного, в котором она выполняется, и программа продолжит выполнение