part of '../main.dart'; class HAView { List cards = []; List badges = []; Entity linkedEntity; String name; String id; String iconName; int count; HAView({ this.name, this.id, this.count, this.iconName, List childEntities }) { _fillView(childEntities ?? []); } void _fillView(List childEntities) { List autoGeneratedCards = []; childEntities.forEach((entity) { if (entity.isBadge) { badges.add(entity); TheLogger.debug("----Badge: ${entity.entityId}"); } else { if (!entity.isGroup) { String groupIdToAdd = "${entity.domain}.${entity.domain}$count"; if (autoGeneratedCards.every((HACard card) => card.id != groupIdToAdd )) { HACard card = HACard( id: groupIdToAdd, name: entity.domain ); TheLogger.debug("----Creating card: $groupIdToAdd"); card.entities.add(entity); autoGeneratedCards.add(card); } else { autoGeneratedCards.firstWhere((card) => card.id == groupIdToAdd).entities.add(entity); } } else { TheLogger.debug("----Card: ${entity.entityId}"); HACard card = HACard( name: entity.displayName, id: entity.entityId, linkedEntity: entity ); card.entities.addAll(entity.childEntities); cards.add(card); } } }); cards.addAll(autoGeneratedCards); } Widget build(BuildContext context) { return HAViewWidget( view: this, ); } } class HAViewWidget extends StatefulWidget { final HAView view; const HAViewWidget({ Key key, this.view }) : super(key: key); @override State createState() { return HAViewWidgetState(); } } class HAViewWidgetState 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( color: Colors.amber, child: ListView( physics: const AlwaysScrollableScrollPhysics(), children: _buildChildren(context), ), onRefresh: () => _refreshData(), ); } List _buildChildren(BuildContext context) { List result = []; if (widget.view.badges.isNotEmpty) { result.insert(0, Wrap( alignment: WrapAlignment.center, spacing: 10.0, runSpacing: 1.0, children: _buildBadges(context), ) ); } widget.view.cards.forEach((HACard card){ result.add( card.build(context) ); }); return result; } List _buildBadges(BuildContext context) { List result = []; widget.view.badges.forEach((Entity entity) { if (!entity.isHidden) { result.add(entity.buildBadgeWidget(context)); } }); return result; } Future _refreshData() { if ((_refreshCompleter != null) && (!_refreshCompleter.isCompleted)) { TheLogger.debug("Previous data refresh is still in progress"); } else { _refreshCompleter = Completer(); eventBus.fire(RefreshDataEvent()); } return _refreshCompleter.future; } @override void dispose() { _refreshDataSubscription.cancel(); super.dispose(); } }