Понимание SchedulerBinding Flutter в контексте анимированной временной шкалы - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь понять часть этого кода ниже, которая использует SchedulerBinding.instance.scheduleFrameCallback(beginFrame);. beginFrame указан в другом блоке кода ниже.

Код берется из здесь , который является анимированной временной шкалой для Flutter . Я не ожидаю, что кто-нибудь прочтет все это, очевидно. Но учитывая некоторый контекст, вы можете понять, для чего он используется?

Контекст: эта часть кода находится внутри функции с именем setViewport. Окно просмотра временной шкалы - это просто видимая часть этой временной шкалы. Таким образом, как только задан видовой экран (указаны точки start и end на временной шкале), он завершает анимацию чего-либо на временной шкале. Вы можете видеть, что в процессе этого он вызывает SchedulerBinding.instance.scheduleFrameCallback, и я хочу знать, для чего он используется. Я, очевидно, зашел на страницу для SchedulerBinding , но объяснение настолько обобщенно c, что я не представляю, для чего он используется.

    if (!animate) {
      _renderStart = start;
      _renderEnd = end;
      advance(0.0, false);
      if (onNeedPaint != null) {
        onNeedPaint();
      }
    } else if (!_isFrameScheduled) {
      _isFrameScheduled = true;
      _lastFrameTime = 0.0;
      SchedulerBinding.instance.scheduleFrameCallback(beginFrame);
    }

Вот beginFrame:

  /// Make sure that all the visible assets are being rendered and advanced
  /// according to the current state of the timeline.
  void beginFrame(Duration timeStamp) {
    _isFrameScheduled = false;
    final double t =
        timeStamp.inMicroseconds / Duration.microsecondsPerMillisecond / 1000.0;
    if (_lastFrameTime == 0.0) {
      _lastFrameTime = t;
      _isFrameScheduled = true;
      SchedulerBinding.instance.scheduleFrameCallback(beginFrame);
      return;
    }

    double elapsed = t - _lastFrameTime;
    _lastFrameTime = t;

    if (!advance(elapsed, true) && !_isFrameScheduled) {
      _isFrameScheduled = true;
      SchedulerBinding.instance.scheduleFrameCallback(beginFrame);
    }

    if (onNeedPaint != null) {
      onNeedPaint();
    }
  }

1 Ответ

0 голосов
/ 08 мая 2020

Согласно проекту README, он используется для синхронизации анимаций Flare в формате c:

"Чтобы анимация воспроизводилась правильно, необходимо также вызывать заранее (прошедшее) для текущего FlutterActor каждый Кроме того, текущая ActorAnimation требует, чтобы для ее правильных интерполированных значений была вызвана функция apply (time) для отображения правильных интерполированных значений. Все это стало возможным благодаря использованию Flutter's SchedulerBinding.scheduleFrameCallback (). "

...