Дарт: потоки против ValueNotifiers

Я работаю в команде, которая разрабатывает приложение, которое должно работать с датчиками для отображения состояния автомобиля. Это состояние может быть представлено через значения, заданные внешними аппаратными датчиками, или минимально работать через собственные датчики мобильного устройства. И мы хотим иметь возможность менять пакеты датчиков (переключаться между мобильными или внешними датчиками). Мы также хотим, чтобы эти значения отображались асинхронно, и мы исследуем Streams и ValueNotifiers в Flutter/Dart.

Каков наилучший способ (поток против ValueNotifier)?

2 ответа

ValueNotifier очень легковесны, и поэтому среда Flutter использует их.
Они не хотели налагать какие-либо потери производительности, независимо от того, насколько они малы, если их можно избежать.

Потоки гораздо более мощные, особенно их способность к компоновке, которая позволяет легко использовать высокоуровневые функциональные возможности, подобные тем, которые предоставлены https://pub.dartlang.org/packages/rxdart.

Использование ValueNotifier в вашем пользовательском коде для тех же соображений производительности, сделанных командой Flutter, вероятно, является преждевременной оптимизацией.

Я бы предложил потоки для бизнес-логики.

Я собираюсь участвовать в этом разговоре, хотя я опаздываю к игре. Я думаю, что разработчики имеют тенденцию перегружать Streams/BLoC/RX/ и т.д. Конечно, архитектура BLoC является мощной, но мне кажется, что она предлагает множество шаблонов по сравнению с чем-то вроде ScopedModel - по сути, то, что кажется версией ValueNotifier внутри InheritedWidget.

ScopedModel удобен тем, что вы можете просто разместить виджет внутри ScopedModelDescendent (очевидно, он находится внутри ScopedModel) и позволить значению, которое вы изменяете в реальном ScopeModel, обновлять дочерние элементы всякий раз, когда вы вызываете метод notifyListeners(). Или вы можете использовать его как способ получить некоторые простые данные или вызвать функцию с помощью.of(context) - что дороже, поскольку он перемещается вверх по дереву виджетов, чтобы найти ScopedModel, поэтому я использую это для таких вещей, как отправка оповещений или инициализация компонента, которому нужны данные из области действия, перед вызовом сборки.

Хотя, прими мой совет с крошкой соли. Я просто нуб с мнением. Что также может помочь объяснить мое презрение к Streams/BLoC. Мне действительно нравятся более простые решения, чем более мощные. Если мне нужно больше силы для ситуации, я, как правило, создаю собственное решение. Как и во всех вещах, для каждого из этих шаблонов есть сценарий использования.

Чтобы дополнить ответ Гюнтера, взгляните на эту статью. Если вы ранее не знали об архитектуре BLoC или потоках, это хороший способ начать и реализовать ее.

Другие вопросы по тегам