ExampleRealtime · Database

Realtime Feed

Build a live feed that updates instantly when records are created, updated, or deleted — without polling.

Setup

Create a posts collection in your dashboard with read: public, write: authenticated, delete: owner. Then connect the realtime subscription after login:

lib/screens/feed_screen.dartDart
class FeedScreen extends StatefulWidget {
  const FeedScreen({super.key});

  @override
  State<FeedScreen> createState() => _FeedScreenState();
}

class _FeedScreenState extends State<FeedScreen> {
  List<KoolbaseRecord> _posts = [];
  KoolbaseSubscription? _sub;
  bool _loading = true;

  @override
  void initState() {
    super.initState();
    _init();
  }

  Future<void> _init() async {
    // 1. Load initial data
    final result = await Koolbase.db
      .collection('posts')
      .orderBy('created_at', descending: true)
      .limit(50)
      .get();

    setState(() {
      _posts = result.records;
      _loading = false;
    });

    // 2. Set realtime token if user is logged in
    final user = await Koolbase.auth.currentUser();
    if (user != null) {
      final token = await Koolbase.auth.getToken();
      Koolbase.realtime.setToken(token!);
    }

    // 3. Subscribe to live changes
    _sub = Koolbase.realtime.on(
      collection: 'posts',
      onCreated: (record) {
        setState(() => _posts.insert(0, record));
      },
      onUpdated: (record) {
        setState(() {
          final i = _posts.indexWhere((p) => p.id == record.id);
          if (i != -1) _posts[i] = record;
        });
      },
      onDeleted: (id) {
        setState(() => _posts.removeWhere((p) => p.id == id));
      },
    );
  }

  @override
  void dispose() {
    _sub?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    if (_loading) return const Center(child: CircularProgressIndicator());

    return ListView.builder(
      itemCount: _posts.length,
      itemBuilder: (_, i) {
        final post = _posts[i];
        return ListTile(
          title: Text(post.data['title'] ?? ''),
          subtitle: Text(post.data['body'] ?? ''),
        );
      },
    );
  }
}

Creating a post

lib/screens/feed_screen.dartDart
Future<void> _createPost(String title, String body) async {
  // Realtime subscription will automatically add this
  // to the list via the onCreated callback
  await Koolbase.db.collection('posts').insert({
    'title': title,
    'body': body,
    'published': true,
  });
}

No manual list update needed

When you insert a record, the realtime subscription fires onCreated and adds it to the list automatically. You don't need to manually refresh or add it to state after insertion.