Я понимаю, что шаблон блока или getX предоставит дополнительные функции, кроме простого управления состоянием при флаттере, но меня больше всего беспокоит, почему я должен использовать bloc, getX или любую другую библиотеку управления состоянием вместо того, чтобы просто использовать setState с глобальными переменными?

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

3
Sahil 13 Май 2021 в 21:57
Как вы используете setState () родительского элемента из дочернего класса?
 – 
Marat
13 Май 2021 в 22:14
Создав глобальную переменную Function и назначив ей "setState () {}" родительского элемента, затем вызовите эту функцию из дочернего элемента
 – 
Sahil
14 Май 2021 в 13:03

4 ответа

Лучший ответ

Вызов функции setState снова создает весь виджет, что является проблемой производительности. Управление состоянием управляет состоянием без создания всего виджета. Кроме того, если ваши данные используются на нескольких экранах, вы должны передавать эти данные, используя аргументы, что является громоздким. Вот почему мы используем библиотеки государственного управления. Надеюсь, он ответит на вопрос.

1
Ali Yar Khan 14 Май 2021 в 17:25
Да, это ответ на мой вопрос. А что касается данных, используемых на нескольких экранах, мы не можем просто использовать глобальные переменные?
 – 
Sahil
15 Май 2021 в 18:28
Мы можем использовать глобальные переменные, я думаю, но это не лучшая практика, а также ... когда значение изменится, как ваш пользовательский интерфейс получит новые значения? это будет большая проблема с глобальными переменными !!!
 – 
Ali Yar Khan
15 Май 2021 в 18:52
У меня была такая же проблема, и я решил ее с помощью setState. (Я знал, что это не лучшее решение, но мне просто нужна была веская причина не использовать setState и использовать некоторую библиотеку управления состоянием.)
 – 
Sahil
15 Май 2021 в 19:07

Всякий раз, когда вы вызываете функцию setState(), весь ваш виджет с сохранением состояния или без него будет перестраиваться заново. Это снижает производительность вашего приложения до низкого уровня.

Например: у вас есть виджет без сохранения состояния, например "Читая"

Scaffold(
 body: Column(
  children: [
   Container(
    child: Text(SomeText);
   ),
   FlatButton(
    onPressed: (){
     seState({
      //change Text Function
     });
    }
   )
  ]
 )
)

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

Здесь Вместо метода setState(), если вы используете какие-либо библиотеки управления состоянием, он изменит только значение SomeText, не затрагивая другие виджеты.

Как новичок вы можете попробовать Provider

2
ijas 13 Май 2021 в 22:24
Спасибо за объяснение. Но как вы можете вызвать setState в виджете без сохранения состояния?
 – 
Sahil
14 Май 2021 в 12:58

Проблема с вызовом setState() в том, что он перестроит всех дочерних элементов, где вы его вызываете.

Вы можете оптимизировать его с помощью InheritedWidget. Но InheritedWidget дает вам шаблонный код.

Так что всегда практично использовать некоторую библиотеку управления состоянием, а не поддерживать InheritedWidgets.

1
SCouto 5 Сен 2021 в 16:54

Я не очень хорошо разбираюсь в производительности флаттера, меня больше беспокоит ремонтопригодность:

  1. Когда ребенок знает о родителе, и наоборот, с виджетами происходит слишком много всего, и вам не удастся наслоить абстракцию, и с течением времени станет трудно рассуждать.

  2. В javascript мы следуем шаблону потока, который говорит о нисходящем потоке состояний: если состояние вашего приложения не следует однонаправленному потоку, его становится сложно понять за очень короткое время.

  3. Если логика состояния не описана выше, ваши компоненты не будут иметь single source of truth, если к тем же данным необходимо получить доступ в другом месте.

Надеюсь, это имеет смысл.

0
Uday Reddy 5 Сен 2021 в 15:03