|
1 | | -import 'dart:async'; |
2 | | - |
3 | 1 | import 'package:flutter/foundation.dart'; |
4 | 2 | import 'package:flutter/material.dart'; |
5 | 3 | import 'package:powersync/powersync.dart'; |
6 | 4 | import 'package:powersync_django_todolist_demo/widgets/fts_search_delegate.dart'; |
7 | 5 | import '../powersync.dart'; |
8 | 6 |
|
9 | | -class StatusAppBar extends StatefulWidget implements PreferredSizeWidget { |
10 | | - const StatusAppBar({super.key, required this.title}); |
11 | | - |
12 | | - final String title; |
| 7 | +class StatusAppBar extends StatelessWidget implements PreferredSizeWidget { |
| 8 | + final Widget title; |
13 | 9 |
|
14 | | - @override |
15 | | - State<StatusAppBar> createState() => _StatusAppBarState(); |
| 10 | + const StatusAppBar({super.key, required this.title}); |
16 | 11 |
|
17 | 12 | @override |
18 | 13 | Size get preferredSize => const Size.fromHeight(kToolbarHeight); |
19 | | -} |
20 | | - |
21 | | -class _StatusAppBarState extends State<StatusAppBar> { |
22 | | - late SyncStatus _connectionState; |
23 | | - StreamSubscription<SyncStatus>? _syncStatusSubscription; |
24 | | - |
25 | | - @override |
26 | | - void initState() { |
27 | | - super.initState(); |
28 | | - _connectionState = db.currentStatus; |
29 | | - _syncStatusSubscription = db.statusStream.listen((event) { |
30 | | - setState(() { |
31 | | - _connectionState = db.currentStatus; |
32 | | - }); |
33 | | - }); |
34 | | - } |
35 | | - |
36 | | - @override |
37 | | - void dispose() { |
38 | | - super.dispose(); |
39 | | - _syncStatusSubscription?.cancel(); |
40 | | - } |
41 | 14 |
|
42 | 15 | @override |
43 | 16 | Widget build(BuildContext context) { |
44 | | - final statusIcon = _getStatusIcon(_connectionState); |
| 17 | + return StreamBuilder( |
| 18 | + stream: db.statusStream, |
| 19 | + initialData: db.currentStatus, |
| 20 | + builder: (context, snapshot) { |
| 21 | + final status = snapshot.data!; |
| 22 | + final statusIcon = _getStatusIcon(status); |
45 | 23 |
|
46 | | - return AppBar( |
47 | | - title: Text(widget.title), |
48 | | - actions: <Widget>[ |
49 | | - IconButton( |
50 | | - onPressed: () { |
51 | | - showSearch(context: context, delegate: FtsSearchDelegate()); |
52 | | - }, |
53 | | - icon: const Icon(Icons.search), |
54 | | - ), |
55 | | - statusIcon, |
56 | | - // Make some space for the "Debug" banner, so that the status |
57 | | - // icon isn't hidden |
58 | | - if (kDebugMode) _makeIcon('Debug mode', Icons.developer_mode), |
59 | | - ], |
| 24 | + return AppBar( |
| 25 | + title: title, |
| 26 | + actions: <Widget>[ |
| 27 | + IconButton( |
| 28 | + onPressed: () { |
| 29 | + showSearch(context: context, delegate: FtsSearchDelegate()); |
| 30 | + }, |
| 31 | + icon: const Icon(Icons.search), |
| 32 | + ), |
| 33 | + statusIcon, |
| 34 | + // Make some space for the "Debug" banner, so that the status |
| 35 | + // icon isn't hidden |
| 36 | + if (kDebugMode) _makeIcon('Debug mode', Icons.developer_mode), |
| 37 | + ], |
| 38 | + ); |
| 39 | + }, |
60 | 40 | ); |
61 | 41 | } |
62 | 42 | } |
|
0 commit comments