builder method

Widget builder(
  1. BuildContext context,
  2. BoxConstraints constraints
)

Implementation

Widget builder(BuildContext context, BoxConstraints constraints)
{
  /// Pages on Navigator stack rebuild when a new page is pushed
  /// https://github.com/flutter/flutter/issues/11655
  /// This hack prevents the page that is being navigated away from
  /// from rebuilding
  var index = NavigationManager().positionInStack(context);
  if (index != 0)
  {
    Log().debug('Framework ${widget.model.templateName} was not built since its index ($index) != 0"/>');
    return Offstage();
  }

  // model is initializing
  if (!widget.model.initialized) return Scaffold(body: Center(child: BusyView(BusyModel(null, visible: true))));

  // set the system constraints
  widget.model.setLayoutConstraints(constraints);

  // Log().debug('Build called on framework view => <FML name=${widget.model.templateName} url="${widget.model.url}"/>');

  // stop listening during build
  widget.model.removeListener(this);

  // fire navigator change
  onNavigatorChange();

  // set device orientation
  _setDeviceOrientation(widget.model.orientation);

  // post onstart callback
  if (!started)
  {
    started = true;
    WidgetsBinding.instance.addPostFrameCallback((_) => widget.model.onStart(context));
  }

  // build framework header
  Widget header = _buildHeader(constraints);

  // build framework footer
  Widget footer = _buildFooter(constraints);

  // build framework body
  Widget body = _buildBody(constraints);

  // framework is header, body, footer stacked in a single column inside a fixed frame
  Widget view = Column(children: [header, body, footer]);

  // We need to provide the stacks children to drawer because positioned
  // widgets must be direct children but the drawer uses a builder widget
  DrawerView? drawer;
  if (widget.model.drawer != null)
  {
    drawer = DrawerView(widget.model.drawer!, view);
    view = Stack(children: [view,drawer]);
  }

  // wrap view in gesture detector
  view = _getGestureDetector(view,drawer);

  // scaffold with safe area
  view = SafeArea(child: Scaffold(resizeToAvoidBottomInset: true, body: view));

  // start listening to model changes
  widget.model.registerListener(this);

  return view;
}