Можно ли не использовать дочерние виджеты повторно при использовании AnimatedList Flutter?

Я работаю над приложением Flutter, которое имеет функции, аналогичные WhatsApp, где может быть множество сообщений, которые по сути являются аудиоплеерами. Я использую AnimatedList, поэтому пузыри чата появляются и исчезают.

Проблема в том, что AnimatedList не поддерживает keepAlive, и я не встречал никаких альтернатив. Я не хочу, чтобы виджеты были переработаны, потому что, если сообщение воспроизводится, и я прокручиваю сообщение, я хочу, чтобы сообщение продолжало воспроизводиться И анимировать, и прямо сейчас я создаю экземпляр аудиоплеера и контроллера анимации в каждом дочернем элементе виджет. Я мог бы видеть, что это было бы более оптимальным, если бы я поддерживал все это состояние вне дочерних виджетов (на том же уровне, что и список), но максимальное количество пузырей чата в разговоре в этом приложении составляет ~ 50, и мы хотим двигаться быстрее, а не быть оптимальным прямо сейчас, поэтому я думаю, что это упрощение - хорошая идея, если я смогу сохранить виджеты в живых.

Я попытался обернуть дочерние виджеты в KeepAlive, но безуспешно. Ниже представлены мои варианты:

  1. Есть какой-то поддерживаемый способ сделать это, и я об этом не знаю.
  2. Существует некоторая альтернативная / сторонняя библиотека, которая поддерживает это
  3. Попробуйте использовать неанимированный список и изучите другие способы анимации
  4. Реализуйте состояние над детьми

Мне было бы любопытно услышать от сообщества о возможных решениях. Спасибо!


person Tony    schedule 15.04.2021    source источник


Ответы (1)


Все предложенные решения хороши (четвертое, наверное, самое надежное, если нужно, чтобы оно работало быстро, но точно не самое эффективное ...).

Думали ли вы об использовании одного InheritedWidget, который вы бы разместили над анимированным списком, который будет управлять аудиоплеером. (Я предполагаю, что вы хотите, чтобы одновременно воспроизводился только один звук).

Конкретно, у вас будет унаследованный виджет, который будет предоставлять метод start (файл файла) и метод паузы (файл файла), а также свойство duration и уникальный идентификатор для текущего воспроизводимого сообщения. Это позволит вам сохранить структуру состояний простой и при этом достаточно эффективной.

Я могу написать фрагмент кода, если мое объяснение недостаточно четкое.

person Gaspard Merten    schedule 15.04.2021
comment
Вариант 4 кажется наиболее долгим для реализации, но наиболее эффективным, поскольку он позволяет вам повторно использовать чат. Если я это сделаю, дело не только в плеере, мне также придется обрабатывать анимированные пузыри чата для индикатора выполнения звука. Я на самом деле склоняюсь к тому, чтобы сделать это таким образом, потому что это кажется правильным, и я склоняюсь к созданию одноэлементного диспетчера пузырей аудиочата, который знает положение звука и, следовательно, может работать с индикаторами выполнения, а также обрабатывает, какой звук играет. Да, желая только по одному. - person Tony; 16.04.2021