Хорошая ли идея сохранять BuildContext в переменной как экземпляр класса?

#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