fix: Load spaces on app start

This commit is contained in:
Krille Fear 2021-11-15 10:05:15 +01:00
parent 7167d0ace6
commit a5f1925f03
3 changed files with 60 additions and 47 deletions

View File

@ -49,7 +49,10 @@ class ChatListController extends State<ChatList> {
StreamSubscription _intentUriStreamSubscription; StreamSubscription _intentUriStreamSubscription;
String _activeSpaceId; String _activeSpaceId;
String get activeSpaceId => _activeSpaceId; String get activeSpaceId =>
Matrix.of(context).client.getRoomById(_activeSpaceId) == null
? null
: _activeSpaceId;
final ScrollController scrollController = ScrollController(); final ScrollController scrollController = ScrollController();
bool scrolledToTop = true; bool scrolledToTop = true;
@ -160,11 +163,9 @@ class ChatListController extends State<ChatList> {
@override @override
void initState() { void initState() {
_initReceiveSharingIntent(); _initReceiveSharingIntent();
WidgetsBinding.instance.addPostFrameCallback(
(_) => waitForFirstSync.then((_) => checkBootstrap()),
);
scrollController.addListener(_onScroll); scrollController.addListener(_onScroll);
waitForFirstSync = _waitForFirstSync(); _waitForFirstSync();
super.initState(); super.initState();
} }
@ -433,7 +434,7 @@ class ChatListController extends State<ChatList> {
Matrix.of(context).client.getRoomById(roomId).pushRuleState == Matrix.of(context).client.getRoomById(roomId).pushRuleState ==
PushRuleState.notify); PushRuleState.notify);
Future<void> waitForFirstSync; bool waitForFirstSync = false;
Future<void> _waitForFirstSync() async { Future<void> _waitForFirstSync() async {
final client = Matrix.of(context).client; final client = Matrix.of(context).client;
@ -452,7 +453,11 @@ class ChatListController extends State<ChatList> {
await space.requestParticipants(); await space.requestParticipants();
} }
} }
return true; setState(() {
waitForFirstSync = true;
});
WidgetsBinding.instance.addPostFrameCallback((_) => checkBootstrap());
return;
} }
void cancelAction() { void cancelAction() {

View File

@ -221,10 +221,9 @@ class _ChatListViewBody extends StatelessWidget {
.where((s) => s.hasRoomUpdate) .where((s) => s.hasRoomUpdate)
.rateLimit(const Duration(seconds: 1)), .rateLimit(const Duration(seconds: 1)),
builder: (context, snapshot) { builder: (context, snapshot) {
return FutureBuilder<void>( return Builder(
future: controller.waitForFirstSync, builder: (context) {
builder: (BuildContext context, snapshot) { if (controller.waitForFirstSync) {
if (snapshot.connectionState == ConnectionState.done) {
final rooms = Matrix.of(context) final rooms = Matrix.of(context)
.client .client
.rooms .rooms

View File

@ -6,6 +6,7 @@ import 'package:salomon_bottom_bar/salomon_bottom_bar.dart';
import 'package:fluffychat/pages/chat_list/chat_list.dart'; import 'package:fluffychat/pages/chat_list/chat_list.dart';
import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/avatar.dart';
import 'package:fluffychat/widgets/matrix.dart';
class SpacesBottomBar extends StatelessWidget { class SpacesBottomBar extends StatelessWidget {
final ChatListController controller; final ChatListController controller;
@ -21,7 +22,14 @@ class SpacesBottomBar extends StatelessWidget {
return Material( return Material(
color: Theme.of(context).appBarTheme.backgroundColor, color: Theme.of(context).appBarTheme.backgroundColor,
elevation: 6, elevation: 6,
child: SalomonBottomBar( child: StreamBuilder<Object>(
stream: Matrix.of(context).client.onSync.stream.where((sync) =>
(sync.rooms?.join?.values?.any((r) =>
r.state?.any((s) => s.type.startsWith('m.space'))) ??
false) ||
(sync.rooms?.leave?.isNotEmpty ?? false)),
builder: (context, snapshot) {
return SalomonBottomBar(
itemPadding: const EdgeInsets.all(8), itemPadding: const EdgeInsets.all(8),
currentIndex: currentIndex, currentIndex: currentIndex,
onTap: (i) => controller.setActiveSpaceId( onTap: (i) => controller.setActiveSpaceId(
@ -56,7 +64,8 @@ class SpacesBottomBar extends StatelessWidget {
)) ))
.toList(), .toList(),
], ],
), );
}),
); );
} }
} }