Я понимаю, что шаблон блока или getX предоставит дополнительные функции, кроме простого управления состоянием при флаттере, но меня больше всего беспокоит, почему я должен использовать bloc, getX или любую другую библиотеку управления состоянием вместо того, чтобы просто использовать setState с глобальными переменными?
Я также понимаю, что если я обновлю значение глобальной переменной из дочернего класса и вернусь к родительскому классу, его состояние не будет обновлено, но для решения этой проблемы я просто вызвал setState () родительского элемента из дочернего класса. . Что-то не так с моим подходом, и если да, то что?
4 ответа
Вызов функции setState
снова создает весь виджет, что является проблемой производительности. Управление состоянием управляет состоянием без создания всего виджета. Кроме того, если ваши данные используются на нескольких экранах, вы должны передавать эти данные, используя аргументы, что является громоздким. Вот почему мы используем библиотеки государственного управления. Надеюсь, он ответит на вопрос.
Всякий раз, когда вы вызываете функцию setState()
, весь ваш виджет с сохранением состояния или без него будет перестраиваться заново. Это снижает производительность вашего приложения до низкого уровня.
Например: у вас есть виджет без сохранения состояния, например "Читая"
Scaffold(
body: Column(
children: [
Container(
child: Text(SomeText);
),
FlatButton(
onPressed: (){
seState({
//change Text Function
});
}
)
]
)
)
Здесь, когда вы нажимаете кнопку и ее функция заключается в изменении значения SomeText
, теперь весь этот код будет перестроен, и да, он заменит SomeText
новым значением. Но он не просто изменяет его, но и перестраивает весь виджет, чтобы изменить его.
Здесь Вместо метода setState()
, если вы используете какие-либо библиотеки управления состоянием, он изменит только значение SomeText, не затрагивая другие виджеты.
Как новичок вы можете попробовать Provider
Проблема с вызовом setState()
в том, что он перестроит всех дочерних элементов, где вы его вызываете.
Вы можете оптимизировать его с помощью InheritedWidget. Но InheritedWidget
дает вам шаблонный код.
Так что всегда практично использовать некоторую библиотеку управления состоянием, а не поддерживать InheritedWidgets
.
Я не очень хорошо разбираюсь в производительности флаттера, меня больше беспокоит ремонтопригодность:
Когда ребенок знает о родителе, и наоборот, с виджетами происходит слишком много всего, и вам не удастся наслоить абстракцию, и с течением времени станет трудно рассуждать.
В javascript мы следуем шаблону потока, который говорит о нисходящем потоке состояний: если состояние вашего приложения не следует однонаправленному потоку, его становится сложно понять за очень короткое время.
Если логика состояния не описана выше, ваши компоненты не будут иметь
single source of truth
, если к тем же данным необходимо получить доступ в другом месте.
Надеюсь, это имеет смысл.
Похожие вопросы
Новые вопросы
android
Android — это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфонов, планшетов, автомобилей, телевизоров, одежды, очков, IoT). Для тем, связанных с Android, используйте теги, специфичные для Android, такие как android-intent, android-activity, android-adapter и т. д. Для вопросов, отличных от разработки или программирования, но связанных с Android framework, используйте эту ссылку: https://android .stackexchange.com.