view method

  1. @override
String view()
override

Renders the current model state for display.

This method is called after every update to refresh the screen. It should return either a String or a View object.

Guidelines

  • Keep view functions pure - no side effects
  • View should only depend on model state
  • Use string interpolation or StringBuffer for complex views
  • Consider terminal width/height for responsive layouts

Example

@override
String view() {
  final buffer = StringBuffer();

  // Header
  buffer.writeln('╔════════════════════════════╗');
  buffer.writeln('║      My Application        ║');
  buffer.writeln('╚════════════════════════════╝');
  buffer.writeln();

  // Content
  if (loading) {
    buffer.writeln('Loading...');
  } else {
    for (final item in items) {
      final prefix = item == selectedItem ? '▸ ' : '  ';
      buffer.writeln('$prefix$item');
    }
  }

  buffer.writeln();

  // Footer
  buffer.writeln('↑/↓: Navigate  Enter: Select  q: Quit');

  return buffer.toString();
}

Implementation

@override
String view() {
  final h = viewport.height ?? 0;
  _height = h;

  final viewLines = viewport.view().split('\n');
  final bar = _scrollbarLines(
    height: viewLines.length,
    contentLines: viewport.lines.length,
    scrollPercent: viewport.scrollPercent,
    chars: chars,
  );

  // content width + separator => bar column
  _barX = viewport.width + separator.length;

  final out = <String>[];
  for (var i = 0; i < viewLines.length; i++) {
    out.add('${viewLines[i]}$separator${bar[i]}');
  }
  return out.join('\n');
}