прочитанный файл возвращает нулевое трепетание

#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(); ), которая ставит в очередь работу для следующего прохода в цикле выполнения для изолированного, в котором она выполняется, и программа продолжит выполнение print инструкции. dart.dev/codelabs/…