Адаптивный MultiChildRenderObjectWidget в Flutter

#flutter #user-interface #flutter-layout

#flutter #пользовательский интерфейс #flutter-layout

Вопрос:

У меня есть MultiChildRenderObjectWidget, который будет размещать некоторые дочерние элементы выше или ниже нижней части измерения высоты экрана. Я передаю дочерние элементы в свой виджет и изначально размещаю дочерние элементы на основе размеров экрана, к которым я могу получить доступ, потому что мне передано a BuildContext в RenderObject createRenderObject(BuildContext context) функции. Кажется, он работает хорошо.

Однако, когда размер экрана изменяется, как я могу повторно выполнить performLayout on my RenderObject , чтобы он передавал дочерние элементы для нового размера экрана?

 class AuthContent extends MultiChildRenderObjectWidget {
  AuthContent({
    Key key,
    this.background,
    this.actionBar,
    this.loginForm,
    this.disclosure,
  })  : assert(background != null),
        assert(actionBar != null),
        assert(loginForm != null),
        assert(disclosure != null),
        super(
            key: key, children: [background, actionBar, disclosure, loginForm]);

  final Background background;
  final ActionBar actionBar;
  final Disclosure disclosure;
  final LoginForm loginForm;

  @override
  RenderObject createRenderObject(BuildContext context) {
    final screenSize = MediaQuery.of(context).size;
    return RenderAuthContent(screenSize: screenSize);
  }
}
  

Комментарии:

1. Что вы подразумеваете под изменением размера экрана? Переключаться с портретной ориентации на альбомную, поворачивая экран?

2. Конечно, это может быть один из сценариев, но также подумайте о рабочем столе или Интернете, и я изменю размер браузера / окна.

Ответ №1:

Нашел хороший пример работы с RenderObject в статье Ника «Как создать виджет Flutter с помощью RenderObject«.

Чего мне не хватало, так это updateRenderObject метода. Переопределяя это, я могу передавать новые свойства RenderObject , которые он может использовать во время performLayout метода.

   @override
  void updateRenderObject(
      BuildContext context, RenderAuthContent renderObject) {
    renderObject..screenSize = screenSize;
  }
  

В моем случае меня волнует изменение размера экрана.