diff --git a/lib/entity_class/entity.class.dart b/lib/entity_class/entity.class.dart index 56f2bc4..b0c33a2 100644 --- a/lib/entity_class/entity.class.dart +++ b/lib/entity_class/entity.class.dart @@ -171,6 +171,7 @@ class _EntityWidgetState extends State { return _buildBadgeWidget(context); } else { TheLogger.log("Error", "Unknown entity widget type: ${widget.widgetType}"); + return Container(width: 0.0, height: 0.0); } } diff --git a/lib/home_assistant.class.dart b/lib/home_assistant.class.dart index 7c9626f..62bdec2 100644 --- a/lib/home_assistant.class.dart +++ b/lib/home_assistant.class.dart @@ -28,8 +28,8 @@ class HomeAssistant { StreamSubscription _socketSubscription; int messageExpirationTime = 50; //seconds - Duration fetchTimeout = Duration(seconds: 45); - Duration connectTimeout = Duration(seconds: 15); + Duration fetchTimeout = Duration(seconds: 30); + Duration connectTimeout = Duration(seconds: 10); String get locationName => _instanceConfig["location_name"] ?? ""; int get viewsCount => _entities.viewList.length ?? 0; @@ -95,8 +95,10 @@ class HomeAssistant { (message) => _handleMessage(_connectionCompleter, message), cancelOnError: true, onDone: () { - TheLogger.log("Debug","Socket stream closed. Disconnected."); - disconnect(); + TheLogger.log("Debug","Disconnect detected. Reconnecting..."); + disconnect().then((_) { + _connection(); + }); }, onError: (e) { TheLogger.log("Error","Socket stream Error: $e"); @@ -129,7 +131,9 @@ class HomeAssistant { _completeConnecting(error); if (!_fetchCompleter.isCompleted) { if (error != null) { - _fetchCompleter.completeError(error); + disconnect().then((_){ + _fetchCompleter.completeError(error); + }); } else { _fetchCompleter.complete(); } diff --git a/lib/view_class.dart b/lib/view_class.dart index 459b543..78ee287 100644 --- a/lib/view_class.dart +++ b/lib/view_class.dart @@ -49,7 +49,7 @@ class View { } -class ViewWidget extends StatelessWidget { +class ViewWidget extends StatefulWidget { final List badges; final Map cards; final String displayName; @@ -61,6 +61,28 @@ class ViewWidget extends StatelessWidget { this.displayName }) : super(key: key); + @override + State createState() { + return ViewWidgetState(); + } + +} + +class ViewWidgetState extends State { + + StreamSubscription _refreshDataSubscription; + Completer _refreshCompleter; + + @override + void initState() { + super.initState(); + _refreshDataSubscription = eventBus.on().listen((event) { + if ((_refreshCompleter != null) && (!_refreshCompleter.isCompleted)) { + _refreshCompleter.complete(); + } + }); + } + @override Widget build(BuildContext context) { return RefreshIndicator( @@ -76,18 +98,18 @@ class ViewWidget extends StatelessWidget { List _buildChildren(BuildContext context) { List result = []; - if (badges.isNotEmpty) { + if (widget.badges.isNotEmpty) { result.insert(0, Wrap( alignment: WrapAlignment.center, spacing: 10.0, runSpacing: 1.0, - children: _buildBadges(context, badges), + children: _buildBadges(context, widget.badges), ) ); } - cards.forEach((String id, CardSkeleton skeleton){ + widget.cards.forEach((String id, CardSkeleton skeleton){ result.add( HACard( entities: skeleton.childEntities, @@ -108,15 +130,22 @@ class ViewWidget extends StatelessWidget { } Future _refreshData() { - Completer refreshCompleter = Completer(); - - eventBus.fire(RefreshDataEvent()); - eventBus.on().listen((event) { - refreshCompleter.complete(); - }); - - return refreshCompleter.future; + if ((_refreshCompleter != null) && (!_refreshCompleter.isCompleted)) { + TheLogger.log("Debug","Previous data refresh is still in progress"); + } else { + _refreshCompleter = Completer(); + eventBus.fire(RefreshDataEvent()); + } + return _refreshCompleter.future; } + + @override + void dispose() { + _refreshDataSubscription.cancel(); + super.dispose(); + } + + } class CardSkeleton {