← Назад к вопросам

Для чего нужен ProxyWidget?

2.0 Middle🔥 191 комментариев
#Flutter виджеты

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ответ

ProxyWidget (или Proxy Widget в контексте Flutter) — это промежуточный виджет, который не создаёт свой собственный RenderObject, а вместо этого делегирует рендеринг своему единственному потомку (child). Это мощный паттерн для добавления функциональности к существующим виджетам без изменения их поведения.

Основное назначение ProxyWidget

Главное предназначение — инкапсулировать логику и функциональность вокруг дочернего виджета, сохраняя его структуру и производительность. ProxyWidget — это базовый класс (abstract) в Flutter, который используется для создания виджетов-обёрток.

Примеры использования

Типичные примеры ProxyWidget:

  • Semantics — добавляет информацию доступности
  • Opacity — изменяет прозрачность
  • Transform — применяет трансформации
  • Padding — добавляет отступы
  • Theme — предоставляет темы дочерним виджетам
  • NotificationListener — слушает уведомления

Пример реализации

class CustomProxyWidget extends ProxyWidget {
  final Color highlightColor;
  final VoidCallback? onTap;

  const CustomProxyWidget({
    required this.child,
    required this.highlightColor,
    this.onTap,
  });

  @override
  RenderObjectWidget createRenderObject(BuildContext context) {
    return _CustomRenderObject(
      highlightColor: highlightColor,
      onTap: onTap,
    );
  }
}

class _CustomRenderObject extends RenderObjectWidget {
  final Color highlightColor;
  final VoidCallback? onTap;

  const _CustomRenderObject({
    required this.highlightColor,
    required this.onTap,
  });

  @override
  RenderObject createRenderObject(BuildContext context) {
    return _CustomRender(highlightColor, onTap);
  }
}

class _CustomRender extends RenderProxyBox {
  final Color highlightColor;
  final VoidCallback? onTap;

  _CustomRender(this.highlightColor, this.onTap);

  @override
  void paint(PaintingContext context, Offset offset) {
    // Свой стиль рендеринга
    super.paint(context, offset);
  }
}

Преимущества использования

Производительность — не создаёт дополнительные слои в widget tree, используя RenderProxyBox который делегирует рендеринг.

Простота — позволяет добавлять функциональность без переписывания основного виджета.

Переиспользуемость — легко обёрнуть любой виджет дополнительной логикой.

Модульность — разделяет ответственность между различными слоями.

Отличие от обычного контейнера

// Обычный подход — создаёт дополнительный слой
Container(
  child: MyWidget(),
)

// ProxyWidget — прямое делегирование без лишних слоёв
MyProxyWidget(
  child: MyWidget(),
)

ProxyWidget является основой для множества встроенных Flutter виджетов и незаменим при создании высокопроизводительных приложений.

Для чего нужен ProxyWidget? | PrepBro