|
1 |
| -import 'dart:async'; |
2 |
| - |
3 | 1 | import 'package:flutter/material.dart';
|
4 | 2 | import 'package:powersync/powersync.dart';
|
| 3 | +import 'package:powersync_flutter_demo/powersync.dart'; |
5 | 4 |
|
6 | 5 | import './list_item.dart';
|
7 | 6 | import './list_item_dialog.dart';
|
@@ -42,63 +41,36 @@ class ListsPage extends StatelessWidget {
|
42 | 41 | }
|
43 | 42 | }
|
44 | 43 |
|
45 |
| -class ListsWidget extends StatefulWidget { |
| 44 | +final class ListsWidget extends StatelessWidget { |
46 | 45 | const ListsWidget({super.key});
|
47 | 46 |
|
48 |
| - @override |
49 |
| - State<StatefulWidget> createState() { |
50 |
| - return _ListsWidgetState(); |
51 |
| - } |
52 |
| -} |
53 |
| - |
54 |
| -class _ListsWidgetState extends State<ListsWidget> { |
55 |
| - static final _listsPriority = BucketPriority(1); |
56 |
| - |
57 |
| - List<TodoList> _data = []; |
58 |
| - bool hasSynced = false; |
59 |
| - StreamSubscription? _subscription; |
60 |
| - StreamSubscription? _syncStatusSubscription; |
61 |
| - |
62 |
| - _ListsWidgetState(); |
63 |
| - |
64 |
| - @override |
65 |
| - void initState() { |
66 |
| - super.initState(); |
67 |
| - final stream = TodoList.watchListsWithStats(); |
68 |
| - _subscription = stream.listen((data) { |
69 |
| - if (!context.mounted) { |
70 |
| - return; |
71 |
| - } |
72 |
| - setState(() { |
73 |
| - _data = data; |
74 |
| - }); |
75 |
| - }); |
76 |
| - _syncStatusSubscription = TodoList.watchSyncStatus().listen((status) { |
77 |
| - if (!context.mounted) { |
78 |
| - return; |
79 |
| - } |
80 |
| - setState(() { |
81 |
| - hasSynced = status.statusForPriority(_listsPriority).hasSynced ?? false; |
82 |
| - }); |
83 |
| - }); |
84 |
| - } |
85 |
| - |
86 |
| - @override |
87 |
| - void dispose() { |
88 |
| - super.dispose(); |
89 |
| - _subscription?.cancel(); |
90 |
| - _syncStatusSubscription?.cancel(); |
91 |
| - } |
92 |
| - |
93 | 47 | @override
|
94 | 48 | Widget build(BuildContext context) {
|
95 |
| - return !hasSynced |
96 |
| - ? const Text("Busy with sync...") |
97 |
| - : ListView( |
98 |
| - padding: const EdgeInsets.symmetric(vertical: 8.0), |
99 |
| - children: _data.map((list) { |
100 |
| - return ListItemWidget(list: list); |
101 |
| - }).toList(), |
| 49 | + return FutureBuilder( |
| 50 | + future: db.waitForFirstSync(priority: _listsPriority), |
| 51 | + builder: (context, snapshot) { |
| 52 | + if (snapshot.connectionState == ConnectionState.done) { |
| 53 | + return StreamBuilder( |
| 54 | + stream: TodoList.watchListsWithStats(), |
| 55 | + builder: (context, snapshot) { |
| 56 | + if (snapshot.data case final todoLists?) { |
| 57 | + return ListView( |
| 58 | + padding: const EdgeInsets.symmetric(vertical: 8.0), |
| 59 | + children: todoLists.map((list) { |
| 60 | + return ListItemWidget(list: list); |
| 61 | + }).toList(), |
| 62 | + ); |
| 63 | + } else { |
| 64 | + return const CircularProgressIndicator(); |
| 65 | + } |
| 66 | + }, |
102 | 67 | );
|
| 68 | + } else { |
| 69 | + return const Text('Busy with sync...'); |
| 70 | + } |
| 71 | + }, |
| 72 | + ); |
103 | 73 | }
|
| 74 | + |
| 75 | + static final _listsPriority = BucketPriority(1); |
104 | 76 | }
|
0 commit comments