diff --git a/flutter/lib/common/widgets/peers_view.dart b/flutter/lib/common/widgets/peers_view.dart index 16a6f98ef..04505125d 100644 --- a/flutter/lib/common/widgets/peers_view.dart +++ b/flutter/lib/common/widgets/peers_view.dart @@ -168,6 +168,7 @@ class _PeersViewState extends State<_PeersView> with WindowListener { Widget _buildPeersView(Peers peers) { _loaded = true; + final updateEvent = peers.event; final body = ObxValue((filters) { return FutureBuilder>( builder: (context, snapshot) { @@ -191,7 +192,14 @@ class _PeersViewState extends State<_PeersView> with WindowListener { ) : SizedBox(width: mobileWidth, child: visibilityChild)); } - return Wrap(spacing: space, runSpacing: space, children: cards); + final child = + Wrap(spacing: space, runSpacing: space, children: cards); + if (updateEvent == UpdateEvent.load) { + _curPeers.clear(); + _curPeers.addAll(peers.map((e) => e.id)); + _queryOnlines(true); + } + return child; } else { return const Center( child: CircularProgressIndicator(), @@ -205,26 +213,19 @@ class _PeersViewState extends State<_PeersView> with WindowListener { return body; } - // ignore: todo - // TODO: variables walk through async tasks? + final _queryInterval = const Duration(seconds: 20); + void _startCheckOnlines() { - final queryInterval = const Duration(seconds: 20); () async { while (!_exit) { final now = DateTime.now(); if (!setEquals(_curPeers, _lastQueryPeers)) { if (now.difference(_lastChangeTime) > const Duration(seconds: 1)) { - if (_curPeers.isNotEmpty) { - platformFFI.ffiBind - .queryOnlines(ids: _curPeers.toList(growable: false)); - _lastQueryPeers = {..._curPeers}; - _lastQueryTime = DateTime.now().subtract(queryInterval); - _queryCount = 0; - } + _queryOnlines(false); } } else { if (_queryCount < _maxQueryCount) { - if (now.difference(_lastQueryTime) >= queryInterval) { + if (now.difference(_lastQueryTime) >= _queryInterval) { if (_curPeers.isNotEmpty) { platformFFI.ffiBind .queryOnlines(ids: _curPeers.toList(growable: false)); @@ -239,6 +240,19 @@ class _PeersViewState extends State<_PeersView> with WindowListener { }(); } + _queryOnlines(bool isLoadEvent) { + if (_curPeers.isNotEmpty) { + platformFFI.ffiBind.queryOnlines(ids: _curPeers.toList(growable: false)); + _lastQueryPeers = {..._curPeers}; + if (isLoadEvent) { + _lastChangeTime = DateTime.now(); + } else { + _lastQueryTime = DateTime.now().subtract(_queryInterval); + } + _queryCount = 0; + } + } + Future>? matchPeers( String searchText, String sortedBy, List peers) async { if (widget.peerFilter != null) { diff --git a/flutter/lib/models/peer_model.dart b/flutter/lib/models/peer_model.dart index 1b71e382e..596355adc 100644 --- a/flutter/lib/models/peer_model.dart +++ b/flutter/lib/models/peer_model.dart @@ -72,10 +72,13 @@ class Peer { ); } +enum UpdateEvent { online, load } + class Peers extends ChangeNotifier { final String name; final String loadEvent; List peers; + UpdateEvent event = UpdateEvent.load; static const _cbQueryOnlines = 'callback_query_onlines'; Peers({required this.name, required this.peers, required this.loadEvent}) { @@ -123,6 +126,7 @@ class Peers extends ChangeNotifier { } }); + event = UpdateEvent.online; notifyListeners(); } @@ -133,6 +137,7 @@ class Peers extends ChangeNotifier { final state = onlineStates[peer.id]; peer.online = state != null && state != false; } + event = UpdateEvent.load; notifyListeners(); }