Анимация с StreamBuilder

Проект

Привет, я создал с помощью flutter простое приложение, которое изменяет высоту контейнера с помощью streambuilder на основе вертикального перетаскивания пользователем.

Так как обновления, вводимые пользователем, выполняются очень быстро, это заставляет потоковый движок перестраиваться несколько раз, создавая эффект анимации.

Код

    final StreamController streamController = StreamController<double>();
    double height = 0.0;

    StreamBuilder(
      initialData: 0.0,
      stream: streamController.stream,
      builder: (context, snapshot) {
        return Container(
          height: snapshot.data,
        );
      },
    ),

     ....

     height += (dragUpdateDY);
     streamController.add(height);

Проблема

Несмотря на то, что код работает так, как задумано, я продолжаю думать, что это не лучшее решение, потому что оно заставляет пользовательский интерфейс перестраивать непредсказуемое количество времени в секунду, может быть, даже более 60 раз, превышая частоту обновления дисплея.

Есть ли способ лучше?


person justAnotherOverflowUser    schedule 18.11.2019    source источник


Ответы (1)


Это совершенно нормально, потому что build на самом деле не вызывается вами! Он всегда вызывается платформой, поэтому он не будет вызываться с частотой более 60 Гц.
Это верно, потому что StreamBuilder вызывает _ 3_ внутренне, что делает следующее:

Вызов setState уведомляет платформу об изменении внутреннего состояния этого объекта. таким образом, который может повлиять на пользовательский интерфейс в этом поддереве, что заставляет платформу планировать build для этого Состояние объекта.

Если вам нужен более детальный контроль, вы можете создать свой собственный _4 _ и вызовите markNeedsPaint или _ 6_ всякий раз, когда вам это нужно на основе _ 7_ s.

person creativecreatorormaybenot    schedule 18.11.2019