TL; DR: Никогда не используйте функции над классами для создания дерева виджетов многократного использования . Вместо этого всегда извлекайте их в StatelessWidget .
Существует огромная разница между использованием функций вместо классов, то есть: среда не знает функций, но может видеть классы.
Рассмотрим следующую функцию «виджета»:
Widget functionWidget({ Widget child}) {
return Container(child: child);
}
использовал так:
functionWidget(
child: functionWidget(),
);
И это эквивалентно классу:
class ClassWidget extends StatelessWidget {
final Widget child;
const ClassWidget({Key key, this.child}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
child: child,
);
}
}
используется так:
new ClassWidget(
child: new ClassWidget(),
);
На бумаге оба, кажется, делают одно и то же: Создайте 2 Container
, вложив одно в другое. Но реальность немного другая.
В случае функций сгенерированное дерево виджетов выглядит так:
Container
Container
В то время как с классами, дерево виджетов:
ClassWidget
Container
ClassWidget
Container
Это очень важно, потому что оно радикально меняет поведение платформы при обновлении виджета. Вот список отличий:
Классы:
- разрешить оптимизацию производительности (конструктор const, оператор == переопределить, более детальная перестройка)
- есть горячая перезагрузка
- встроены в инспектор виджетов (debugFillProperties)
- может определять ключи
- можно использовать контекстный API
- убедитесь, что все виджеты используются одинаково (всегда конструктор)
- гарантирует, что переключение между двумя различными макетами правильно удаляет ресурсы (функции могут повторно использовать некоторое предыдущее состояние)
Функции:
- имеет меньше кода (и даже там я сделал генератор кода, чтобы сделать классы такими же маленькими, как функции: functions_widget )
-
Вывод должен быть уже достаточно ясен:
Не используйте функции для создания виджетов .