Почему в этом коде await не блокирует пользовательский интерфейс при дрожании - PullRequest
0 голосов
/ 09 июля 2020

В примере приложения по умолчанию, когда вы создаете новый проект fultter, я просто добавляю следующий код.

  initState() {
    super.initState();
    loop();
  }

  loop() async {
    while (true) {
      await Future.delayed(Duration(milliseconds: 10));
      print("count now:$_counter");
    }
  }
  1. Почему пользовательский интерфейс приложения не блокируется? Я могу нажать кнопку +, и счетчик плавно увеличивается. Даже если я изменю задержку на 10 сек c, пользовательский интерфейс будет отзывчивым. Работает ли l oop () в другом потоке? Но я знаю, что dart - это однопоточный. Как это возможно?

  2. Где работает функция l oop?

  3. Могу ли я использовать эту технику, например, для запуска фоновой задачи проверка идентификатора, мои строки таблицы sqflite синхронизируются с облаком et c ???

1 Ответ

1 голос
/ 10 июля 2020

Ожидающие вызовы не блокируются. Это работает так: в то время как Dart является однопоточным, некоторый код Dart делегирует свою реализацию виртуальной машине Dart.

Такие вещи, как чтение файлов или HTTP-запросы, выполняются вне Dart (либо браузером, либо в C ++. ) в другом потоке.

Таким образом, хотя Dart является однопоточным, он все еще может выполнять несколько задач одновременно без блокировки пользовательского интерфейса.

...