render method

  1. @override
Widget render(
  1. RSwitchListTileRenderRequest request
)

Implementation

@override
Widget render(RSwitchListTileRenderRequest request) {
  final state = request.state;
  final spec = request.spec;
  final slots = request.slots;
  final tokens = _resolveTokens(request);
  final motionTheme = HeadlessThemeProvider.of(request.context)
          ?.capability<HeadlessMotionTheme>() ??
      HeadlessMotionTheme.cupertino;

  final animationDuration = tokens.motion?.stateChangeDuration ??
      motionTheme.button.stateChangeDuration;

  final switchWidget = slots?.switchIndicator != null
      ? slots!.switchIndicator!.build(
          RSwitchListTileSwitchContext(
            spec: spec,
            state: state,
            child: request.switchWidget,
          ),
          (_) => request.switchWidget,
        )
      : request.switchWidget;

  final defaultTitle = DefaultTextStyle(
    style: tokens.titleStyle,
    child: request.title,
  );
  final title = slots?.title != null
      ? slots!.title!.build(
          RSwitchListTileTextContext(
            spec: spec,
            state: state,
            child: defaultTitle,
          ),
          (_) => defaultTitle,
        )
      : defaultTitle;

  final defaultSubtitle = request.subtitle == null
      ? null
      : DefaultTextStyle(
          style: tokens.subtitleStyle,
          child: request.subtitle!,
        );
  final subtitle = slots?.subtitle != null
      ? slots!.subtitle!.build(
          RSwitchListTileTextContext(
            spec: spec,
            state: state,
            child: defaultSubtitle ?? const SizedBox.shrink(),
          ),
          (_) => defaultSubtitle ?? const SizedBox.shrink(),
        )
      : defaultSubtitle;

  final secondary = slots?.secondary != null
      ? slots!.secondary!.build(
          RSwitchListTileSecondaryContext(
            spec: spec,
            state: state,
            child: request.secondary ?? const SizedBox.shrink(),
          ),
          (_) => request.secondary ?? const SizedBox.shrink(),
        )
      : request.secondary;

  final resolvedAffinity = _resolveAffinity(spec.controlAffinity);

  final isLeading = resolvedAffinity == RSwitchControlAffinity.leading;

  final textColumn = Expanded(
    child: Column(
      mainAxisSize: MainAxisSize.min,
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        title,
        if (subtitle != null) ...[
          SizedBox(height: tokens.verticalGap),
          subtitle,
        ],
      ],
    ),
  );

  final List<Widget> rowChildren = [];
  if (secondary != null && !isLeading) {
    rowChildren.add(secondary);
    rowChildren.add(SizedBox(width: tokens.horizontalGap));
  }
  if (isLeading) {
    rowChildren.add(switchWidget);
    rowChildren.add(SizedBox(width: tokens.horizontalGap));
  }
  rowChildren.add(textColumn);
  if (!isLeading) {
    rowChildren.add(SizedBox(width: tokens.horizontalGap));
    rowChildren.add(switchWidget);
  }
  if (secondary != null && isLeading) {
    rowChildren.add(SizedBox(width: tokens.horizontalGap));
    rowChildren.add(secondary);
  }

  final defaultTile = Padding(
    padding: tokens.contentPadding,
    child: Row(
      children: rowChildren,
    ),
  );

  final result = slots?.tile != null
      ? slots!.tile!.build(
          RSwitchListTileTileContext(
            spec: spec,
            state: state,
            child: defaultTile,
          ),
          (_) => defaultTile,
        )
      : defaultTile;

  Widget constrained = ConstrainedBox(
    constraints: BoxConstraints(
      minHeight: request.constraints?.minHeight ?? tokens.minHeight,
    ),
    child: result,
  );

  constrained = CupertinoPressableOpacity(
    duration: animationDuration,
    pressedOpacity: tokens.pressOpacity,
    isPressed: state.isPressed,
    isEnabled: !state.isDisabled,
    visualEffects: request.visualEffects,
    child: constrained,
  );

  if (state.isDisabled && tokens.disabledOpacity < 1) {
    constrained = Opacity(
      opacity: tokens.disabledOpacity,
      child: constrained,
    );
  }

  return constrained;
}