build method

Widget build(
  1. BuildContext context,
  2. bool selected,
  3. VoidCallback onPressed, {
  4. PaneDisplayMode? displayMode,
  5. bool showTextOnTop = true,
  6. bool autofocus = false,
})

Used to construct the pane items all around NavigationView. You can customize how the pane items should look like by overriding this method

Implementation

Widget build(
  BuildContext context,
  bool selected,
  VoidCallback onPressed, {
  PaneDisplayMode? displayMode,
  bool showTextOnTop = true,
  bool autofocus = false,
}) {
  final mode = displayMode ??
      _NavigationBody.maybeOf(context)?.displayMode ??
      PaneDisplayMode.minimal;
  assert(displayMode != PaneDisplayMode.auto);
  final bool isTop = mode == PaneDisplayMode.top;
  final bool isCompact = mode == PaneDisplayMode.compact;
  final bool isOpen =
      [PaneDisplayMode.open, PaneDisplayMode.minimal].contains(mode);
  final style = NavigationPaneTheme.of(context);

  final String titleText =
      title != null && title is Text ? (title! as Text).data ?? '' : '';

  Widget result = SizedBox(
    key: itemKey,
    height: !isTop ? 41.0 : null,
    width: isCompact ? _kCompactNavigationPanelWidth : null,
    child: HoverButton(
      autofocus: autofocus,
      onPressed: onPressed,
      cursor: style.cursor,
      builder: (context, states) {
        final textStyle = selected
            ? style.selectedTextStyle?.resolve(states)
            : style.unselectedTextStyle?.resolve(states);
        final textResult = titleText.isNotEmpty
            ? Padding(
                padding: style.labelPadding ?? EdgeInsets.zero,
                child: Text(titleText, style: textStyle),
              )
            : SizedBox.shrink();
        Widget child = Flex(
          direction: isTop ? Axis.vertical : Axis.horizontal,
          textDirection: isTop ? ui.TextDirection.ltr : ui.TextDirection.rtl,
          mainAxisAlignment:
              isTop ? MainAxisAlignment.center : MainAxisAlignment.end,
          children: [
            if (isOpen) Expanded(child: textResult),
            () {
              final icon = Padding(
                padding: style.iconPadding ?? EdgeInsets.zero,
                child: IconTheme.merge(
                  data: IconThemeData(
                    color: (selected
                            ? style.selectedIconColor?.resolve(states)
                            : style.unselectedIconColor?.resolve(states)) ??
                        textStyle?.color,
                    size: 18.0,
                  ),
                  child: this.icon,
                ),
              );
              if (isOpen) return icon;
              return icon;
            }(),
          ],
        );
        if (isTop && showTextOnTop)
          child = Row(mainAxisSize: MainAxisSize.min, children: [
            child,
            textResult,
          ]);
        child = AnimatedContainer(
          duration: style.animationDuration ?? Duration.zero,
          curve: style.animationCurve ?? standartCurve,
          color: () {
            final ButtonState<Color?> tileColor = style.tileColor ??
                ButtonState.resolveWith((states) {
                  return ButtonThemeData.uncheckedInputColor(
                    FluentTheme.of(context),
                    states,
                  );
                });
            return tileColor.resolve(states);
          }(),
          child: child,
        );
        return Semantics(
          label: title == null ? null : titleText,
          selected: selected,
          child: FocusBorder(
            child: child,
            focused: states.isFocused,
            renderOutside: false,
          ),
        );
      },
    ),
  );
  if (((isTop && !showTextOnTop) || isCompact) && titleText.isNotEmpty)
    return Tooltip(
      message: titleText,
      style: TooltipThemeData(
        textStyle: title is Text ? (title as Text).style : null,
      ),
      child: result,
    );
  return result;
}