From a30565e0e1784d031efc82ceda1c5242dacc6585 Mon Sep 17 00:00:00 2001 From: xsahil03x Date: Mon, 23 Nov 2020 17:40:41 +0530 Subject: [PATCH] [ChannelListHeader] Refactor, Add support for trailing, leading widget taps. --- lib/src/channel_list_header.dart | 111 ++++++++++++++++++++++--------- 1 file changed, 80 insertions(+), 31 deletions(-) diff --git a/lib/src/channel_list_header.dart b/lib/src/channel_list_header.dart index 94266045..147f9340 100644 --- a/lib/src/channel_list_header.dart +++ b/lib/src/channel_list_header.dart @@ -7,22 +7,57 @@ import 'package:stream_chat_flutter/stream_chat_flutter.dart'; import 'stream_chat.dart'; -typedef TitleBuilder = Widget Function( +typedef _TitleBuilder = Widget Function( BuildContext context, ConnectionStatus status, Client client, ); +/// +/// It shows the current [Client] status. +/// +/// ```dart +/// class MyApp extends StatelessWidget { +/// final Client client; +/// +/// MyApp(this.client); +/// +/// @override +/// Widget build(BuildContext context) { +/// return MaterialApp( +/// home: StreamChat( +/// client: client, +/// child: Scaffold( +/// appBar: ChannelListHeader(), +/// ), +/// ), +/// ); +/// } +/// } +/// ``` +/// +/// Usually you would use this widget as an [AppBar] inside a [Scaffold]. +/// However you can also use it as a normal widget. +/// +/// The widget components render the ui based on the first ancestor of type [StreamChatTheme] and on its [ChannelTheme.channelHeaderTheme] property. +/// Modify it to change the widget appearance. class ChannelListHeader extends StatelessWidget implements PreferredSizeWidget { + /// Instantiates a ChannelListHeader const ChannelListHeader({ Key key, this.client, this.titleBuilder, + this.onUserAvatarTap, + this.onNewChatButtonTap, }) : super(key: key); final Client client; - final TitleBuilder titleBuilder; + final _TitleBuilder titleBuilder; + + final Function(User) onUserAvatarTap; + + final VoidCallback onNewChatButtonTap; @override Widget build(BuildContext context) { @@ -37,7 +72,8 @@ class ChannelListHeader extends StatelessWidget implements PreferredSizeWidget { leading: Center( child: UserAvatar( user: user, - onTap: (_) => Scaffold.of(context).openDrawer(), + onTap: onUserAvatarTap ?? (_) => Scaffold.of(context).openDrawer(), + borderRadius: BorderRadius.circular(20), constraints: BoxConstraints.tightFor( height: 40, width: 40, @@ -68,7 +104,7 @@ class ChannelListHeader extends StatelessWidget implements PreferredSizeWidget { ); }, ), - onPressed: () {}, + onPressed: onNewChatButtonTap, ), ) ], @@ -80,11 +116,11 @@ class ChannelListHeader extends StatelessWidget implements PreferredSizeWidget { } switch (status) { case ConnectionStatus.connected: - return _buildConnectedTitleState(); + return _buildConnectedTitleState(context); case ConnectionStatus.connecting: - return _buildConnectingTitleState(); + return _buildConnectingTitleState(context); case ConnectionStatus.disconnected: - return _buildDisconnectedTitleState(_client); + return _buildDisconnectedTitleState(context, _client); default: return Offstage(); } @@ -93,16 +129,19 @@ class ChannelListHeader extends StatelessWidget implements PreferredSizeWidget { ); } - Widget _buildConnectedTitleState() => Text( + Widget _buildConnectedTitleState(BuildContext context) => Text( 'Stream Chat', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - color: Colors.black, - ), + style: StreamChatTheme.of(context) + .channelTheme + .channelHeaderTheme + .title + .copyWith( + fontSize: 16, + fontWeight: FontWeight.bold, + ), ); - Widget _buildConnectingTitleState() { + Widget _buildConnectingTitleState(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -116,37 +155,47 @@ class ChannelListHeader extends StatelessWidget implements PreferredSizeWidget { SizedBox(width: 10), Text( 'Searching for Network', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - color: Colors.black, - ), - ) + style: StreamChatTheme.of(context) + .channelTheme + .channelHeaderTheme + .title + .copyWith( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), ], ); } - Widget _buildDisconnectedTitleState(Client client) { + Widget _buildDisconnectedTitleState(BuildContext context, Client client) { return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( 'Offline...', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - color: Colors.black, - ), + style: StreamChatTheme.of(context) + .channelTheme + .channelHeaderTheme + .title + .copyWith( + fontSize: 16, + fontWeight: FontWeight.bold, + ), ), TextButton( onPressed: () => client.connect(), child: Text( 'Try Again', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, - color: Color(0xFF006CFF), - ), + style: StreamChatTheme.of(context) + .channelTheme + .channelHeaderTheme + .title + .copyWith( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Color(0xFF006CFF), + ), ), ), ],