import 'package:flutter/material.dart'; import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart'; import 'stream_chat.dart'; /// Widget that builds itself based on the latest snapshot of interaction with /// a [Stream] of type [ConnectionStatus]. /// /// The widget will use the closest [StreamChatClient.wsConnectionStatusStream] in case no /// stream is provided. class ConnectionStatusBuilder extends StatelessWidget { /// Creates a new ConnectionStatusBuilder const ConnectionStatusBuilder({ Key key, @required this.statusBuilder, this.initialStatus = ConnectionStatus.disconnected, this.connectionStatusStream, this.errorBuilder, this.loadingBuilder, }) : assert(statusBuilder != null), super(key: key); /// The connection status that will be used to create the initial snapshot. final ConnectionStatus initialStatus; /// The asynchronous computation to which this builder is currently connected. final Stream connectionStatusStream; /// The builder that will be used in case of error final Widget Function(BuildContext context, Object error) errorBuilder; /// The builder that will be used in case of loading final WidgetBuilder loadingBuilder; /// The builder that will be used in case of data final Widget Function(BuildContext context, ConnectionStatus status) statusBuilder; @override Widget build(BuildContext context) { final stream = connectionStatusStream ?? StreamChat.of(context).client.wsConnectionStatusStream; return StreamBuilder( initialData: initialStatus, stream: stream, builder: (context, snapshot) { if (snapshot.hasError) { if (errorBuilder != null) { return errorBuilder(context, snapshot.error); } return Offstage(); } if (!snapshot.hasData) { if (loadingBuilder != null) return loadingBuilder(context); return Offstage(); } return statusBuilder(context, snapshot.data); }, ); } }