A small Flutter toolkit that makes it easier to build UI from Streams, with convenient builders and lifecycle-aware listeners.

Features

  • AppStreamBuilder: a StreamBuilder-like widget with customizable loading/empty/error builders.
  • AppStreamListener: lifecycle-aware stream subscription with onData, onError, and onDone callbacks.
  • AppStreamConsumer: combines listener + builder.
  • AppStreamState: simple typed state classes (optional utility).

Getting started

Add app_stream_kit to your pubspec.yaml:

dependencies:
  app_stream_kit: ^0.0.1

Usage

AppStreamBuilder

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:app_stream_kit/app_stream_kit.dart';

class Example extends StatelessWidget {
  Example({super.key});

  final Stream<int> stream = Stream<int>.periodic(const Duration(seconds: 1), (i) => i);

  @override
  Widget build(BuildContext context) {
    return AppStreamBuilder<int>(
      stream: stream,
      initialData: 0,
      loadingBuilder: (_) => const CircularProgressIndicator(),
      emptyBuilder: (_) => const Text('No data'),
      errorBuilder: (context, error, _) => Text('Error: $error'),
      onData: (data) {
        // optional side-effect
      },
      builder: (context, data) => Text('Latest: $data'),
    );
  }
}

AppStreamListener

AppStreamListener<int>(
  stream: stream,
  onData: (data) => debugPrint('data: $data'),
  onError: (e) => debugPrint('error: $e'),
  onDone: () => debugPrint('done'),
  child: const Text('Listening...'),
)

AppStreamConsumer

AppStreamConsumer<int>(
  stream: stream,
  initialData: 0,
  listener: (context, data) {
    debugPrint('consumer data: $data');
  },
  loadingBuilder: (_) => const CircularProgressIndicator(),
  errorBuilder: (context, error, _) => Text('Error: $error'),
  emptyBuilder: (_) => const Text('No data'),
  builder: (context, data) => Text('Latest: $data'),
)

Additional information

Pull requests welcome.

Libraries

app_stream_kit