0x00 Компоненты без сохранения состояния и компоненты с отслеживанием состояния
Виджет — это базовый элемент управления при разработке интерфейса fltter, как и статус uiview в ios, так называемый виджет «все есть».
Виджет делится на statelessWidget и statefulWidget, в чем разница между ними. Одним словом, statelesswidget используется для отображения представлений без сохранения состояния, а statefulwidget — для отображения интерактивных динамических представлений.
На данный момент сделан основной вывод, так как же состояние реализует обновление состояния?
Оригинальный адрес публикацииflutterdev.top
0x01 Парадигма программирования пользовательского интерфейса
В разработке для iOS и Android используется императивная парадигма программирования, в то время как во флаттере, интерфейсе VUE и разработке апплетов используется декларативное программирование.
такие как иос
UILable * lable = [UILable new];
label.text = "hello world";
Это императивный стиль, который непосредственно выполняет точное и эффективное управление назначением свойств в элементе управления.
Однако флаттер выглядит следующим образом
class BgChangeView extends StatefulWidget {
@override
_BgChangeViewState createState() => _BgChangeViewState();
Color color = Colors.red;
}
class _BgChangeViewState extends State<BgChangeView> {
int count = 10;
void _incrementCounter() {
setState(() {
count = count>255 ? 0 :count + 10;
widget.color = Color.fromARGB(count, 0x00, 0xff, 0xff);
print("state refresh count ${count}");
});
}
@override
Widget build(BuildContext context) {
return Container(
width: 100,
height: 100,
child: RaisedButton(onPressed: _incrementCounter,
color: widget.color,
),
);
}
}
Назначьте цвет для кнопки повышения, цвет обновляется в состоянии, таким образом обновляя цвет фона кнопки повышения.
Как реализован 0x02
состояние представляет собой состояние представления.Когда setState запускает уничтожение и реконструкцию текущего представления и его подпредставлений, оно восстанавливается в порядке от родительского представления к подпредставлению, сверху вниз.
Угадайте реализацию внутреннего состояния
По сути, состояние отвечает за уничтожение и перестроение, в процессе перестроения происходит перегенерация дерева виджетов на одном уровне, а внешние данные переназначаются виджету, потому что эффективность внутреннего механизма перестроения виджета очень высока, и это почти невидимо невооруженным глазом.Процесс его разрушения, но если операция состояния часто выполняется на корневом представлении, это приведет к большим потерям производительности, зависанию, высокой загрузке ЦП и ГП. Это также недостаток декларативного программирования. При использовании необходимо избегать слишком большого количества операций setState.
ПС: спасибо@VadasikНапоминаем, что назначение не является точным, проверьте, что исходный код setate не является операцией прямого назначения, удалите некоторые аномальные суждения, такие как обновление, было ли оно заброшено, нужно напрямую добавить старый элемент к грязным элементам и затем создайте новый элемент, стек вызовов, setstate->_element.markNeedsBuild();-->owner.scheduleBuildFor(this); Основной код выглядит следующим образом:
if (!_scheduledFlushDirtyElements && onBuildScheduled != null) {
_scheduledFlushDirtyElements = true;
onBuildScheduled();
}
_dirtyElements.add(element);
element._inDirtyList = true;
Конечно, производительность этой части будет оптимизирована внутри движка флаттера, после каждой перестройки пространство, используемое ранее примененным виджетом или рандер-объектом, не будет очищаться и освобождаться одно за другим.滑动压缩
способ очистки. Как показано ниже
- Flutter делит область памяти на две части: активное пространство и неактивное пространство.
- Когда пользователь использует приложение, флаттер постоянно применяется к пространству памяти в активном пространстве.
- Пока не будет заполнено место для приобретения
- Проверьте активные объекты в активном пространстве и отметьте активные объекты вместе с объектами, от которых они зависят.
- Перемещайте активный объект в неактивную область, когда приложение бездействует, в это время среди активных объектов нет неактивной области.
- Меняйте состояния между неактивными и активными областями
Справочная статья
- Боевая технология ядра флаттераtime.geekgang.org/column/arity…
- технология флаттер-памятиwoohoo.hello Ted.com/flutter/201…