feat: Exposed builders

This commit is contained in:
Deven Joshi
2021-02-17 15:59:48 +05:30
parent 62f4e27378
commit f488290057
4 changed files with 82 additions and 59 deletions
@@ -67,8 +67,6 @@ class ChannelListView extends StatefulWidget {
this.channelWidget,
this.channelPreviewBuilder,
this.separatorBuilder,
this.errorBuilder,
this.emptyBuilder,
this.onImageTap,
this.onStartChatPressed,
this.swipeToAction = false,
@@ -77,17 +75,15 @@ class ChannelListView extends StatefulWidget {
this.padding,
this.selectedChannels = const [],
this.onViewInfoTap,
this.errorBuilder,
this.emptyBuilder,
this.loadingBuilder,
this.listBuilder,
}) : super(key: key);
/// The builder that will be used in case of error
final Widget Function(Error error) errorBuilder;
/// If true a default swipe to action behaviour will be added to this widget
final bool swipeToAction;
/// The builder used when the channel list is empty.
final WidgetBuilder emptyBuilder;
/// The query filters to use.
/// You can query on any of the custom fields you've defined on the [Channel].
/// You can also filter other built-in channel fields.
@@ -147,6 +143,18 @@ class ChannelListView extends StatefulWidget {
final ViewInfoCallback onViewInfoTap;
/// The builder that will be used in case of error
final ErrorBuilder errorBuilder;
/// The builder that will be used in case of loading
final WidgetBuilder loadingBuilder;
/// The builder which is used when list of channels loads
final Function(BuildContext, List<Channel>) listBuilder;
/// The builder used when the channel list is empty.
final WidgetBuilder emptyBuilder;
@override
_ChannelListViewState createState() => _ChannelListViewState();
}
@@ -161,16 +169,16 @@ class _ChannelListViewState extends State<ChannelListView>
Widget build(BuildContext context) {
var child = ChannelListCore(
channelListController: _channelListController,
listBuilder: (context, list) {
listBuilder: widget.listBuilder ?? (context, list) {
return _buildListView(list);
},
emptyBuilder: (BuildContext context) {
emptyBuilder: widget.emptyBuilder ?? (BuildContext context) {
return _buildEmptyWidget();
},
errorBuilder: (BuildContext context, dynamic error) {
errorBuilder: widget.errorBuilder ?? (BuildContext context, dynamic error) {
return _buildErrorWidget(context);
},
loadingBuilder: (BuildContext context) {
loadingBuilder: widget.loadingBuilder ?? (BuildContext context) {
return _buildLoadingWidget();
},
pagination: widget.pagination,
@@ -236,10 +244,6 @@ class _ChannelListViewState extends State<ChannelListView>
}
Widget _buildEmptyWidget() {
if (widget.emptyBuilder != null) {
return widget.emptyBuilder(context);
}
return LayoutBuilder(
builder: (context, viewportConstraints) {
return SingleChildScrollView(
@@ -126,6 +126,10 @@ class MessageListView extends StatefulWidget {
this.messageHighlightColor,
this.onShowMessage,
this.showConnectionStateTile = false,
this.loadingBuilder,
this.emptyBuilder,
this.messageListBuilder,
this.errorWidgetBuilder,
}) : super(key: key);
/// Function used to build a custom message widget
@@ -185,6 +189,20 @@ class MessageListView extends StatefulWidget {
final bool showConnectionStateTile;
/// Function called when messages are fetched
final Widget Function(BuildContext, List<Message>) messageListBuilder;
/// Function used to build a loading widget
final WidgetBuilder loadingBuilder;
/// Function used to build an empty widget
final WidgetBuilder emptyBuilder;
/// Callback triggered when an error occurs while performing the given request.
/// This parameter can be used to display an error message to users in the event
/// of a connection failure.
final ErrorBuilder errorWidgetBuilder;
@override
_MessageListViewState createState() => _MessageListViewState();
}
@@ -244,12 +262,12 @@ class _MessageListViewState extends State<MessageListView> {
@override
Widget build(BuildContext context) {
return MessageListCore(
loadingBuilder: (context) {
loadingBuilder: widget.loadingBuilder ?? (context) {
return Center(
child: const CircularProgressIndicator(),
);
},
emptyBuilder: (context) {
emptyBuilder: widget.emptyBuilder ?? (context) {
return Center(
child: Text(
'No chats here yet...',
@@ -261,13 +279,13 @@ class _MessageListViewState extends State<MessageListView> {
),
);
},
messageListBuilder: (context, list) {
messageListBuilder: widget.messageListBuilder ?? (context, list) {
return _buildListView(list);
},
messageListController: _messageListController,
parentMessage: widget.parentMessage,
showScrollToBottom: widget.showScrollToBottom,
errorWidgetBuilder: (BuildContext context, Object error) {
errorWidgetBuilder: widget.errorWidgetBuilder ?? (BuildContext context, Object error) {
return Center(
child: Text(
'Something went wrong',
@@ -53,14 +53,16 @@ class MessageSearchListView extends StatefulWidget {
this.sortOptions,
this.paginationParams,
this.messageFilters,
this.emptyBuilder,
this.errorBuilder,
this.separatorBuilder,
this.itemBuilder,
this.onItemTap,
this.showResultCount = true,
this.pullToRefresh = true,
this.showErrorTile = false,
this.emptyBuilder,
this.errorBuilder,
this.loadingBuilder,
this.childBuilder,
}) : super(key: key);
/// Message String to search on
@@ -94,12 +96,6 @@ class MessageSearchListView extends StatefulWidget {
/// Function called when tapping on a [MessageSearchItem]
final MessageSearchItemTapCallback onItemTap;
/// The builder used when the channel list is empty.
final EmptyMessageSearchBuilder emptyBuilder;
/// The builder that will be used in case of error
final Widget Function(Error error) errorBuilder;
/// Builder used to create a custom item separator
final IndexedWidgetBuilder separatorBuilder;
@@ -111,6 +107,18 @@ class MessageSearchListView extends StatefulWidget {
final bool showErrorTile;
/// The builder that is used when the search messages are fetched
final Widget Function(List<GetMessageResponse>) childBuilder;
/// The builder used when the channel list is empty.
final WidgetBuilder emptyBuilder;
/// The builder that will be used in case of error
final ErrorBuilder errorBuilder;
/// The builder that will be used in case of loading
final WidgetBuilder loadingBuilder;
@override
_MessageSearchListViewState createState() => _MessageSearchListViewState();
}
@@ -128,10 +136,7 @@ class _MessageSearchListViewState extends State<MessageSearchListView> {
paginationParams: widget.paginationParams,
messageFilters: widget.messageFilters,
messageSearchListController: _messageSearchListController,
emptyBuilder: (context) {
if (widget.emptyBuilder != null) {
return widget.emptyBuilder(context, widget.messageQuery);
}
emptyBuilder: widget.emptyBuilder ?? (context) {
return LayoutBuilder(
builder: (context, viewportConstraints) {
return SingleChildScrollView(
@@ -148,15 +153,11 @@ class _MessageSearchListViewState extends State<MessageSearchListView> {
},
);
},
errorBuilder: (BuildContext context, dynamic error) {
errorBuilder: widget.emptyBuilder ?? (BuildContext context, dynamic error) {
if (error is Error) {
print((error).stackTrace);
}
if (widget.errorBuilder != null) {
return widget.errorBuilder(error);
}
var message = error.toString();
if (error is DioError) {
if (error.type == DioErrorType.RESPONSE) {
@@ -203,7 +204,7 @@ class _MessageSearchListViewState extends State<MessageSearchListView> {
),
);
},
loadingBuilder: (context) {
loadingBuilder: widget.loadingBuilder ?? (context) {
return LayoutBuilder(
builder: (context, viewportConstraints) {
return SingleChildScrollView(
@@ -220,7 +221,7 @@ class _MessageSearchListViewState extends State<MessageSearchListView> {
},
);
},
childBuilder: (list) {
childBuilder: widget.childBuilder ?? (list) {
return _buildListView(list);
},
);
@@ -45,8 +45,6 @@ class UserListView extends StatefulWidget {
/// Instantiate a new UserListView
const UserListView({
Key key,
this.errorBuilder,
this.emptyBuilder,
this.filter,
this.options,
this.sort,
@@ -61,18 +59,16 @@ class UserListView extends StatefulWidget {
this.pullToRefresh = true,
this.groupAlphabetically = false,
this.crossAxisCount = 1,
this.errorBuilder,
this.emptyBuilder,
this.loadingBuilder,
this.listBuilder,
}) : assert(
crossAxisCount == 1 || groupAlphabetically == false,
'Cannot group alphabetically when crossAxisCount > 1',
),
super(key: key);
/// The builder that will be used in case of error
final Widget Function(Error error) errorBuilder;
/// The builder used when the channel list is empty.
final WidgetBuilder emptyBuilder;
/// The query filters to use.
/// You can query on any of the custom fields you've defined on the [Channel].
/// You can also filter other built-in channel fields.
@@ -130,6 +126,18 @@ class UserListView extends StatefulWidget {
/// The number of children in the cross axis.
final int crossAxisCount;
/// The builder that will be used in case of error
final Widget Function(Error error) errorBuilder;
/// The builder that will be used to build the list
final Widget Function(BuildContext context, List<ListItem> users) listBuilder;
/// The builder that will be used for loading
final WidgetBuilder loadingBuilder;
/// The builder used when the channel list is empty.
final WidgetBuilder emptyBuilder;
@override
_UserListViewState createState() => _UserListViewState();
}
@@ -143,13 +151,13 @@ class _UserListViewState extends State<UserListView>
@override
Widget build(BuildContext context) {
var child = UserListCore(
errorBuilder: (err) {
errorBuilder: widget.errorBuilder ?? (err) {
return _buildError(err);
},
emptyBuilder: (context) {
emptyBuilder: widget.emptyBuilder ?? (context) {
return _buildEmpty();
},
loadingBuilder: (context) {
loadingBuilder: widget.loadingBuilder ?? (context) {
return LayoutBuilder(
builder: (context, viewportConstraints) {
return SingleChildScrollView(
@@ -166,7 +174,7 @@ class _UserListViewState extends State<UserListView>
},
);
},
listBuilder: (context, list) {
listBuilder: widget.listBuilder ?? (context, list) {
return _buildListView(list);
},
pagination: widget.pagination,
@@ -195,10 +203,6 @@ class _UserListViewState extends State<UserListView>
Widget _buildError(Error error) {
print((error).stackTrace);
if (widget.errorBuilder != null) {
return widget.errorBuilder(error);
}
var message = error.toString();
if (error is DioError) {
final dioError = error as DioError;
@@ -246,10 +250,6 @@ class _UserListViewState extends State<UserListView>
}
Widget _buildEmpty() {
if (widget.emptyBuilder != null) {
return widget.emptyBuilder(context);
}
return LayoutBuilder(
builder: (context, viewportConstraints) {
return SingleChildScrollView(