#flutter
#flutter
Вопрос:
Это хорошая идея?
// Maybe save the context here?
// BuildContext _ctx;
Widget _buildItem() {
// No context here!!!
}
@override
Widget build(BuildContext context) {
// we have the context here
final dataList = getDataList(context);
return ListView(
children: dataList.map(_buildItem).toList(),
);
}
Обновление: я просто нахожу Builder
виджет. Это хороший вариант использования?
Комментарии:
1. Для какой цели
_ctx
будет использоваться?2. @dm_tr Идея заключалась
_ctx = context
вbuild
функции, которую_buildItem
можно использовать_ctx
для доступаcontext
.3. Для этого не нужно изобретать колеса. Просто добавьте параметр контекста в свой метод следующим
Widget _buildItem(BuildContext context)
образом. Затем при вызове его в методе сборки контекст передается напрямую4. Что такое ContentType
dataList
?
Ответ №1:
Не рекомендуется сохранять контекст в переменной. Всегда ищите альтернативное решение, когда вам нужен контекст. Кроме того, когда вам нужно создать пользовательский виджет, создайте новый класс, который расширяет виджет без состояния вместо использования функции. Если вы пришли из react, здесь нет перехватов, поэтому обновление вашего виджета в будущем может быть проблематичным. Использование классов является правильным способом создания пользовательских компонентов и имеет различные преимущества, такие как производительность, инспектор виджетов и т. Д.
Если вы не можете отказаться от функционального объявления, здесь есть интересная статья: https://medium.com/flutter-community/use-functional-widgets-in-flutter-to-reduce-boilerplate-code-9e815c2ddb94
Комментарии:
1. Почему классы должны повышать производительность в этом случае?
2. Когда имеешь дело с большим приложением, иногда вам нужно обновить состояние одного компонента вместо повторного рендеринга всей страницы. Когда вы используете функциональные компоненты, вы не можете обновлять их содержимое без повторного рендеринга родительского компонента, что приводит к небольшой или большой потере производительности. Вот почему вы используете класс или библиотеку, которые я предлагаю вам выше в статье
Ответ №2:
Если вы хотите получить доступ к context
любому месту, даже за пределами вашего build
метода, вы можете, например, использовать Get package, который содержит контекст вашего приложения независимо от места. Каждый раз, когда вам нужно context
, просто делайте это так просто, как Get.context