From 16eb9bd397fcbcc6d8527108940fa5c1d310c2c3 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 24 Aug 2020 11:07:32 +0200 Subject: [PATCH 01/30] implement didUpdateWidget in ChannelListView to react to setState --- lib/src/channel_list_view.dart | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/src/channel_list_view.dart b/lib/src/channel_list_view.dart index 61b557b6..231e1ba9 100644 --- a/lib/src/channel_list_view.dart +++ b/lib/src/channel_list_view.dart @@ -352,10 +352,9 @@ class _ChannelListViewState extends State void initState() { super.initState(); - final channelsBloc = ChannelsBloc.of(context); - WidgetsBinding.instance.addObserver(this); + final channelsBloc = ChannelsBloc.of(context); channelsBloc.queryChannels( filter: widget.filter, sortOptions: widget.sort, @@ -390,6 +389,24 @@ class _ChannelListViewState extends State }); } + @override + void didUpdateWidget(ChannelListView oldWidget) { + super.didUpdateWidget(oldWidget); + + if (widget.filter != oldWidget.filter || + widget.sort != oldWidget.sort || + widget.pagination != oldWidget.pagination || + widget.options != oldWidget.options) { + final channelsBloc = ChannelsBloc.of(context); + channelsBloc.queryChannels( + filter: widget.filter, + sortOptions: widget.sort, + paginationParams: widget.pagination, + options: widget.options, + ); + } + } + @override void dispose() { WidgetsBinding.instance.removeObserver(this); From b8757e0e4cc0729c76ac5ef36e2da0de240f0c22 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 24 Aug 2020 15:12:25 +0200 Subject: [PATCH 02/30] version bump --- CHANGELOG.md | 4 ++++ pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc19a470..e94ff64d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.5 + +- Implement `didUpdateWidget` in `ChannelListView` to react to setState + ## 0.2.4 - Update llc dependency diff --git a/pubspec.yaml b/pubspec.yaml index 75f239f3..b24ba511 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_flutter homepage: https://github.com/GetStream/stream-chat-flutter description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter. -version: 0.2.4 +version: 0.2.5 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues From 1e8fbd285408c70f39781704d76665c0671b5d42 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 25 Aug 2020 11:07:29 +0200 Subject: [PATCH 03/30] add pullToRefresh property to ChannelListView --- lib/src/channel_list_view.dart | 176 ++++++++++++++++++--------------- 1 file changed, 95 insertions(+), 81 deletions(-) diff --git a/lib/src/channel_list_view.dart b/lib/src/channel_list_view.dart index 231e1ba9..b0f39ea6 100644 --- a/lib/src/channel_list_view.dart +++ b/lib/src/channel_list_view.dart @@ -60,6 +60,7 @@ class ChannelListView extends StatefulWidget { this.channelPreviewBuilder, this.errorBuilder, this.onImageTap, + this.pullToRefresh = true, }) : super(key: key); /// The builder that will be used in case of error @@ -105,6 +106,9 @@ class ChannelListView extends StatefulWidget { /// The function called when the image is tapped final Function(Channel) onImageTap; + /// Set it to false to disable the pull-to-refresh widget + final bool pullToRefresh; + @override _ChannelListViewState createState() => _ChannelListViewState(); } @@ -115,105 +119,115 @@ class _ChannelListViewState extends State @override Widget build(BuildContext context) { - final channelsProvider = ChannelsBloc.of(context); + final channelsBloc = ChannelsBloc.of(context); + + if (!widget.pullToRefresh) { + return _buildListView(channelsBloc); + } return RefreshIndicator( onRefresh: () async { - return channelsProvider.queryChannels( + return channelsBloc.queryChannels( filter: widget.filter, sortOptions: widget.sort, paginationParams: widget.pagination, options: widget.options, ); }, - child: StreamBuilder>( - stream: channelsProvider.channelsStream, - builder: (context, snapshot) { - if (snapshot.hasError) { - if (snapshot.error is Error) { - print((snapshot.error as Error).stackTrace); - } + child: _buildListView(channelsBloc), + ); + } - if (widget.errorBuilder != null) { - return widget.errorBuilder(snapshot.error); - } + StreamBuilder> _buildListView( + ChannelsBlocState channelsBlocState, + ) { + return StreamBuilder>( + stream: channelsBlocState.channelsStream, + builder: (context, snapshot) { + if (snapshot.hasError) { + if (snapshot.error is Error) { + print((snapshot.error as Error).stackTrace); + } - var message = snapshot.error.toString(); - if (snapshot.error is DioError) { - final dioError = snapshot.error as DioError; - if (dioError.type == DioErrorType.RESPONSE) { - message = dioError.message; - } else { - message = 'Check your connection and retry'; - } + if (widget.errorBuilder != null) { + return widget.errorBuilder(snapshot.error); + } + + var message = snapshot.error.toString(); + if (snapshot.error is DioError) { + final dioError = snapshot.error as DioError; + if (dioError.type == DioErrorType.RESPONSE) { + message = dioError.message; + } else { + message = 'Check your connection and retry'; } - return Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text.rich( - TextSpan( - children: [ - WidgetSpan( - child: Padding( - padding: const EdgeInsets.only( - right: 2.0, - ), - child: Icon(Icons.error_outline), + } + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text.rich( + TextSpan( + children: [ + WidgetSpan( + child: Padding( + padding: const EdgeInsets.only( + right: 2.0, ), + child: Icon(Icons.error_outline), ), - TextSpan(text: 'Error loading channels'), - ], - ), - style: Theme.of(context).textTheme.headline6, + ), + TextSpan(text: 'Error loading channels'), + ], ), - Padding( - padding: const EdgeInsets.only( - top: 16.0, - ), - child: Text(message), + style: Theme.of(context).textTheme.headline6, + ), + Padding( + padding: const EdgeInsets.only( + top: 16.0, ), - FlatButton( - onPressed: () { - channelsProvider.queryChannels( - filter: widget.filter, - sortOptions: widget.sort, - paginationParams: widget.pagination, - options: widget.options, - ); - }, - child: Text('Retry'), - ), - ], - ), - ); - } - - if (!snapshot.hasData) { - return Center( - child: CircularProgressIndicator(), - ); - } - - final channels = snapshot.data; - return ListView.custom( - physics: AlwaysScrollableScrollPhysics(), - controller: _scrollController, - childrenDelegate: SliverChildBuilderDelegate( - (context, i) { - return _itemBuilder(context, i, channels); - }, - childCount: (channels.length * 2) + 1, - findChildIndexCallback: (key) { - final ValueKey valueKey = key; - final index = channels.indexWhere( - (channel) => 'CHANNEL-${channel.id}' == valueKey.value); - return index != -1 ? (index * 2) : null; - }, + child: Text(message), + ), + FlatButton( + onPressed: () { + channelsBlocState.queryChannels( + filter: widget.filter, + sortOptions: widget.sort, + paginationParams: widget.pagination, + options: widget.options, + ); + }, + child: Text('Retry'), + ), + ], ), ); - }), - ); + } + + if (!snapshot.hasData) { + return Center( + child: CircularProgressIndicator(), + ); + } + + final channels = snapshot.data; + return ListView.custom( + physics: AlwaysScrollableScrollPhysics(), + controller: _scrollController, + childrenDelegate: SliverChildBuilderDelegate( + (context, i) { + return _itemBuilder(context, i, channels); + }, + childCount: (channels.length * 2) + 1, + findChildIndexCallback: (key) { + final ValueKey valueKey = key; + final index = channels.indexWhere( + (channel) => 'CHANNEL-${channel.id}' == valueKey.value); + return index != -1 ? (index * 2) : null; + }, + ), + ); + }); } Widget _itemBuilder(context, int i, List channels) { From 5bcc9bdf912a51e7f134083ac7850b02dcb90268 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 25 Aug 2020 11:09:37 +0200 Subject: [PATCH 04/30] add onLinkTap to MessageWidget --- lib/src/message_text.dart | 8 +++++++- lib/src/message_widget.dart | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/src/message_text.dart b/lib/src/message_text.dart index 6ca99f6c..2ee6a6f8 100644 --- a/lib/src/message_text.dart +++ b/lib/src/message_text.dart @@ -11,10 +11,12 @@ class MessageText extends StatelessWidget { @required this.message, @required this.messageTheme, this.onMentionTap, + this.onLinkTap, }) : super(key: key); final Message message; final void Function(User) onMentionTap; + final void Function(String) onLinkTap; final MessageTheme messageTheme; @override @@ -35,7 +37,11 @@ class MessageText extends StatelessWidget { print('tap on ${mentionedUser.name}'); } } else { - launchURL(context, link); + if (onLinkTap != null) { + onLinkTap(link); + } else { + launchURL(context, link); + } } }, styleSheet: MarkdownStyleSheet.fromTheme( diff --git a/lib/src/message_widget.dart b/lib/src/message_widget.dart index fc6aecf2..056e433a 100644 --- a/lib/src/message_widget.dart +++ b/lib/src/message_widget.dart @@ -97,6 +97,9 @@ class MessageWidget extends StatefulWidget { /// The function called when tapping on UserAvatar final void Function(User) onUserAvatarTap; + /// The function called when tapping on a link + final void Function(String) onLinkTap; + final List readList; /// If true show the users username next to the timestamp of the message @@ -128,6 +131,7 @@ class MessageWidget extends StatefulWidget { this.showDeleteMessage = true, this.showEditMessage = true, this.onUserAvatarTap, + this.onLinkTap, this.onMessageActions, this.editMessageInputBuilder, this.textBuilder, @@ -764,6 +768,7 @@ class _MessageWidgetState extends State { return widget.textBuilder != null ? widget.textBuilder(context, widget.message) : MessageText( + onLinkTap: widget.onLinkTap, message: widget.message, onMentionTap: widget.onMentionTap, messageTheme: widget.messageTheme, From f2c6e1a810da5c800b7b5f5a2b05c3572ef26ab9 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 25 Aug 2020 15:15:20 +0200 Subject: [PATCH 05/30] version bump --- CHANGELOG.md | 5 +++++ pubspec.yaml | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e94ff64d..f6f900fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.2.6 + +- Add `pullToRefresh` property to `ChannelListView` +- Add `onLinkTap` to `MessageWidget` + ## 0.2.5 - Implement `didUpdateWidget` in `ChannelListView` to react to setState diff --git a/pubspec.yaml b/pubspec.yaml index b24ba511..a801c529 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_flutter homepage: https://github.com/GetStream/stream-chat-flutter description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter. -version: 0.2.5 +version: 0.2.6 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -23,7 +23,7 @@ dependencies: file_picker: ^1.12.0 image_picker: ^0.6.7+2 flutter_keyboard_visibility: ^3.2.1 - stream_chat: ^0.2.3 + stream_chat: ^0.2.3+1 mime: ^0.9.6+3 visibility_detector: ^0.1.5 http_parser: ^3.1.4 From 9fbbe2ac5cf340730506cd5a763f457227c6a176 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 26 Aug 2020 11:45:42 +0200 Subject: [PATCH 06/30] version bump --- CHANGELOG.md | 4 ++++ example/pubspec.yaml | 2 +- pubspec.yaml | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6f900fc..b8ae9fa0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.6+1 + +- Update llc dependency + ## 0.2.6 - Add `pullToRefresh` property to `ChannelListView` diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 3f3837b4..23beab12 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -1,7 +1,7 @@ name: example description: A new Flutter project. -version: 1.0.1+2 +version: 1.0.3+4 environment: sdk: ">=2.2.2 <3.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index a801c529..415c890b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_flutter homepage: https://github.com/GetStream/stream-chat-flutter description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter. -version: 0.2.6 +version: 0.2.6+1 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -23,7 +23,7 @@ dependencies: file_picker: ^1.12.0 image_picker: ^0.6.7+2 flutter_keyboard_visibility: ^3.2.1 - stream_chat: ^0.2.3+1 + stream_chat: ^0.2.3+2 mime: ^0.9.6+3 visibility_detector: ^0.1.5 http_parser: ^3.1.4 From 241e18f609ad7e2186753efad9095102346cb64e Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Thu, 27 Aug 2020 11:17:09 +0200 Subject: [PATCH 07/30] fix typo --- lib/src/channels_bloc.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/channels_bloc.dart b/lib/src/channels_bloc.dart index e2cf9cd9..0e7ee243 100644 --- a/lib/src/channels_bloc.dart +++ b/lib/src/channels_bloc.dart @@ -11,7 +11,7 @@ class ChannelsBloc extends StatefulWidget { /// The widget child final Widget child; - /// Set this to false to prevent channels to be brought to the top of the list when a new message arrives + /// Set this to true to prevent channels to be brought to the top of the list when a new message arrives final bool lockChannelsOrder; /// Instantiate a new ChannelsBloc From b97d10238937cc447e930031737fbdfe58f08e52 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 8 Sep 2020 09:29:43 +0200 Subject: [PATCH 08/30] add no channels info text --- lib/src/channel_list_view.dart | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lib/src/channel_list_view.dart b/lib/src/channel_list_view.dart index b0f39ea6..c31c4649 100644 --- a/lib/src/channel_list_view.dart +++ b/lib/src/channel_list_view.dart @@ -211,6 +211,25 @@ class _ChannelListViewState extends State } final channels = snapshot.data; + + if (channels.isEmpty) { + return LayoutBuilder( + builder: (context, viewportConstraints) { + return SingleChildScrollView( + physics: AlwaysScrollableScrollPhysics(), + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: viewportConstraints.maxHeight, + ), + child: Center( + child: Text('You have no channels currently'), + ), + ), + ); + }, + ); + } + return ListView.custom( physics: AlwaysScrollableScrollPhysics(), controller: _scrollController, From f5f7ab9f40e9b46694ff494e5d59e5a2b0cf7d2a Mon Sep 17 00:00:00 2001 From: Kriz Mendoza Date: Tue, 8 Sep 2020 18:05:05 -0700 Subject: [PATCH 09/30] Pass in SendMessageResponse to onMessageSent callback, instead of mostly empty Message object --- lib/src/message_input.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/src/message_input.dart b/lib/src/message_input.dart index 6358e39e..e0e3104b 100644 --- a/lib/src/message_input.dart +++ b/lib/src/message_input.dart @@ -909,9 +909,9 @@ class MessageInputState extends State { ); } - return sendingFuture.whenComplete(() { + return sendingFuture.then((resp) { if (widget.onMessageSent != null) { - widget.onMessageSent(message); + widget.onMessageSent(resp.message); } else { if (widget.editMessage != null) { Navigator.pop(context); From ef51103b81d4da77509d839032d5e2cbe5920824 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 9 Sep 2020 14:29:36 +0200 Subject: [PATCH 10/30] version bump --- CHANGELOG.md | 5 +++ lib/src/stream_chat.dart | 95 +++++++++++++++++++++------------------- pubspec.yaml | 4 +- 3 files changed, 56 insertions(+), 48 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b8ae9fa0..b3d55284 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.2.7 + +- Update llc dependency +- Fixed a bug that made the SDK crash if it went to background while not connected + ## 0.2.6+1 - Update llc dependency diff --git a/lib/src/stream_chat.dart b/lib/src/stream_chat.dart index ad6ba47c..dfc6095b 100644 --- a/lib/src/stream_chat.dart +++ b/lib/src/stream_chat.dart @@ -176,55 +176,58 @@ class StreamChatState extends State with WidgetsBindingObserver { @override void didChangeAppLifecycleState(AppLifecycleState state) { - if (state == AppLifecycleState.paused) { - if (client.showLocalNotification != null) { - _newMessageSubscription = client - .on(EventType.messageNew) - .where((e) => e.user?.id != user.id) - .where((e) => e.message.silent != true) - .listen((event) async { - var channel = client.state.channels[event.cid]; + if (client.state?.user != null) { + if (state == AppLifecycleState.paused) { + if (client.showLocalNotification != null) { + _newMessageSubscription = client + .on(EventType.messageNew) + .where((e) => e.user?.id != user.id) + .where((e) => e.message.silent != true) + .listen((event) async { + var channel = client.state.channels[event.cid]; - if (channel == null) { - channel = client.channel( - event.type, - id: event.cid.split(':')[1], + if (channel == null) { + channel = client.channel( + event.type, + id: event.cid.split(':')[1], + ); + await channel.query(); + } + + client.showLocalNotification( + event.message, + ChannelModel( + id: channel.id, + createdAt: channel.createdAt, + extraData: channel.extraData, + type: channel.type, + memberCount: channel.memberCount, + frozen: channel.frozen, + cid: channel.cid, + deletedAt: channel.deletedAt, + config: channel.config, + createdBy: channel.createdBy, + updatedAt: channel.updatedAt, + lastMessageAt: channel.lastMessageAt, + ), ); - await channel.query(); - } - - client.showLocalNotification( - event.message, - ChannelModel( - id: channel.id, - createdAt: channel.createdAt, - extraData: channel.extraData, - type: channel.type, - memberCount: channel.memberCount, - frozen: channel.frozen, - cid: channel.cid, - deletedAt: channel.deletedAt, - config: channel.config, - createdBy: channel.createdBy, - updatedAt: channel.updatedAt, - lastMessageAt: channel.lastMessageAt, - ), - ); - }); - _disconnectTimer = Timer(client.backgroundKeepAlive, () { + }); + _disconnectTimer = Timer(client.backgroundKeepAlive, () { + client.disconnect(); + }); + } else { client.disconnect(); - }); - } else { - client.disconnect(); - } - } else if (state == AppLifecycleState.resumed) { - _newMessageSubscription?.cancel(); - if (_disconnectTimer?.isActive == true) { - _disconnectTimer.cancel(); - } else { - if (client.wsConnectionStatus.value == ConnectionStatus.disconnected) { - NotificationService.handleIosMessageQueue(client); - client.connect(); + } + } else if (state == AppLifecycleState.resumed) { + _newMessageSubscription?.cancel(); + if (_disconnectTimer?.isActive == true) { + _disconnectTimer.cancel(); + } else { + if (client.wsConnectionStatus.value == + ConnectionStatus.disconnected) { + NotificationService.handleIosMessageQueue(client); + client.connect(); + } } } } diff --git a/pubspec.yaml b/pubspec.yaml index 415c890b..5259f987 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_flutter homepage: https://github.com/GetStream/stream-chat-flutter description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter. -version: 0.2.6+1 +version: 0.2.7 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -23,7 +23,7 @@ dependencies: file_picker: ^1.12.0 image_picker: ^0.6.7+2 flutter_keyboard_visibility: ^3.2.1 - stream_chat: ^0.2.3+2 + stream_chat: ^0.2.4 mime: ^0.9.6+3 visibility_detector: ^0.1.5 http_parser: ^3.1.4 From bd22ee0fd67ba195a016d86f7df19f52f0a1ac77 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 16 Sep 2020 10:35:28 +0200 Subject: [PATCH 11/30] fix channellistview loading when client is not initialized --- lib/src/channel_list_view.dart | 20 ++++++++++++++++---- lib/src/channels_bloc.dart | 27 ++++++++++++++------------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/lib/src/channel_list_view.dart b/lib/src/channel_list_view.dart index c31c4649..c387594d 100644 --- a/lib/src/channel_list_view.dart +++ b/lib/src/channel_list_view.dart @@ -205,8 +205,20 @@ class _ChannelListViewState extends State } if (!snapshot.hasData) { - return Center( - child: CircularProgressIndicator(), + return LayoutBuilder( + builder: (context, viewportConstraints) { + return SingleChildScrollView( + physics: AlwaysScrollableScrollPhysics(), + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: viewportConstraints.maxHeight, + ), + child: Center( + child: CircularProgressIndicator(), + ), + ), + ); + }, ); } @@ -374,7 +386,7 @@ class _ChannelListViewState extends State filter: widget.filter, sortOptions: widget.sort, paginationParams: widget.pagination.copyWith( - offset: channelsProvider.channels.length, + offset: channelsProvider.channels?.length ?? 0, ), options: widget.options, ); @@ -426,7 +438,7 @@ class _ChannelListViewState extends State void didUpdateWidget(ChannelListView oldWidget) { super.didUpdateWidget(oldWidget); - if (widget.filter != oldWidget.filter || + if (widget.filter?.toString() != oldWidget.filter?.toString() || widget.sort != oldWidget.sort || widget.pagination != oldWidget.pagination || widget.options != oldWidget.options) { diff --git a/lib/src/channels_bloc.dart b/lib/src/channels_bloc.dart index 0e7ee243..cc2d4f93 100644 --- a/lib/src/channels_bloc.dart +++ b/lib/src/channels_bloc.dart @@ -56,8 +56,7 @@ class ChannelsBlocState extends State final BehaviorSubject _queryChannelsLoadingController = BehaviorSubject.seeded(false); - final BehaviorSubject> _channelsController = - BehaviorSubject.seeded([]); + final BehaviorSubject> _channelsController = BehaviorSubject(); /// The stream notifying the state of queryChannel call Stream get queryChannelsLoading => @@ -73,7 +72,10 @@ class ChannelsBlocState extends State Map options, bool onlyOffline = false, }) async { - if (_queryChannelsLoadingController.value == true) { + final client = StreamChat.of(context).client; + + if (client.state?.user == null || + _queryChannelsLoadingController.value == true) { return; } _queryChannelsLoadingController.sink.add(true); @@ -82,16 +84,15 @@ class ChannelsBlocState extends State final clear = paginationParams == null || paginationParams.offset == null || paginationParams.offset == 0; - final oldChannels = List.from(channels); - StreamChat.of(context) - .client + final oldChannels = List.from(channels ?? []); + client .queryChannels( - filter: filter, - sort: sortOptions, - options: options, - paginationParams: paginationParams, - onlyOffline: onlyOffline, - ) + filter: filter, + sort: sortOptions, + options: options, + paginationParams: paginationParams, + onlyOffline: onlyOffline, + ) .listen((channels) { if (clear) { _channelsController.add(channels); @@ -139,7 +140,7 @@ class ChannelsBlocState extends State } _subscriptions.add(client.on(EventType.channelHidden).listen((event) async { - final newChannels = List.from(channels); + final newChannels = List.from(channels ?? []); final channelIndex = newChannels.indexWhere((c) => c.cid == event.cid); if (channelIndex > -1) { final channel = newChannels.removeAt(channelIndex); From 7cd360315ee4b9a62ed8ec949cc24775308195ff Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 16 Sep 2020 10:38:41 +0200 Subject: [PATCH 12/30] version bump --- CHANGELOG.md | 5 +++++ pubspec.yaml | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b3d55284..983ce2c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.2.7+1 + +- Fix channellistview loading when client is not initialized +- Update LLC dependency + ## 0.2.7 - Update llc dependency diff --git a/pubspec.yaml b/pubspec.yaml index 5259f987..fd6d65c5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_flutter homepage: https://github.com/GetStream/stream-chat-flutter description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter. -version: 0.2.7 +version: 0.2.7+1 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -23,7 +23,7 @@ dependencies: file_picker: ^1.12.0 image_picker: ^0.6.7+2 flutter_keyboard_visibility: ^3.2.1 - stream_chat: ^0.2.4 + stream_chat: ^0.2.4+1 mime: ^0.9.6+3 visibility_detector: ^0.1.5 http_parser: ^3.1.4 From 6790a658885ed9719de68a78d38d08d18f646095 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 16 Sep 2020 11:29:35 +0200 Subject: [PATCH 13/30] version bump --- CHANGELOG.md | 2 +- pubspec.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 983ce2c9..aa1509cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.2.7+1 +## 0.2.7+2 - Fix channellistview loading when client is not initialized - Update LLC dependency diff --git a/pubspec.yaml b/pubspec.yaml index fd6d65c5..9a09e53f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_flutter homepage: https://github.com/GetStream/stream-chat-flutter description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter. -version: 0.2.7+1 +version: 0.2.7+2 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -23,7 +23,7 @@ dependencies: file_picker: ^1.12.0 image_picker: ^0.6.7+2 flutter_keyboard_visibility: ^3.2.1 - stream_chat: ^0.2.4+1 + stream_chat: ^0.2.4+2 mime: ^0.9.6+3 visibility_detector: ^0.1.5 http_parser: ^3.1.4 From 363d53b3647f96e8ee8b8b541575fdc0acab90c9 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Thu, 17 Sep 2020 10:31:16 +0200 Subject: [PATCH 14/30] version bump --- CHANGELOG.md | 4 ++++ pubspec.yaml | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa1509cd..3c2a43d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.8 + +- Update LLC dependency + ## 0.2.7+2 - Fix channellistview loading when client is not initialized diff --git a/pubspec.yaml b/pubspec.yaml index 9a09e53f..35674c61 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_flutter homepage: https://github.com/GetStream/stream-chat-flutter description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter. -version: 0.2.7+2 +version: 0.2.8 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -23,7 +23,7 @@ dependencies: file_picker: ^1.12.0 image_picker: ^0.6.7+2 flutter_keyboard_visibility: ^3.2.1 - stream_chat: ^0.2.4+2 + stream_chat: ^0.2.5 mime: ^0.9.6+3 visibility_detector: ^0.1.5 http_parser: ^3.1.4 From d05dbf26bb6d5d28e42ce091d758e043d8e549fe Mon Sep 17 00:00:00 2001 From: Laff Date: Thu, 17 Sep 2020 19:36:14 -0700 Subject: [PATCH 15/30] Expose ScrollViewKeyboardDismissBehavior to LIstView --- lib/src/message_list_view.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/src/message_list_view.dart b/lib/src/message_list_view.dart index a48fee83..545f42eb 100644 --- a/lib/src/message_list_view.dart +++ b/lib/src/message_list_view.dart @@ -104,6 +104,7 @@ class MessageListView extends StatefulWidget { this.onThreadTap, this.dateDividerBuilder, this.scrollPhysics = const AlwaysScrollableScrollPhysics(), + this.keyboardDismissBehavior = ScrollViewKeyboardDismissBehavior.manual, }) : super(key: key); /// Function used to build a custom message widget @@ -128,6 +129,9 @@ class MessageListView extends StatefulWidget { /// The ScrollPhysics used by the ListView final ScrollPhysics scrollPhysics; + /// The [ScrollViewKeyboardDismissBehavior] used by the ListView + final ScrollViewKeyboardDismissBehavior keyboardDismissBehavior; + @override _MessageListViewState createState() => _MessageListViewState(); } @@ -159,6 +163,7 @@ class _MessageListViewState extends State { child: ListView.custom( key: Key('messageListView'), physics: widget.scrollPhysics, + keyboardDismissBehavior: widget.keyboardDismissBehavior, controller: _scrollController, reverse: true, childrenDelegate: SliverChildBuilderDelegate( From d3811b72ce17aa6226cee3d33c3b2d3a62b18212 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 21 Sep 2020 12:47:48 +0200 Subject: [PATCH 16/30] add basic testing for channel_preview widget --- lib/src/channel_image.dart | 2 +- lib/src/typing_indicator.dart | 2 +- pubspec.yaml | 3 ++ test/src/channel_preview_test.dart | 52 ++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 test/src/channel_preview_test.dart diff --git a/lib/src/channel_image.dart b/lib/src/channel_image.dart index bef666db..82bea25e 100644 --- a/lib/src/channel_image.dart +++ b/lib/src/channel_image.dart @@ -71,7 +71,7 @@ class ChannelImage extends StatelessWidget { String image; if (snapshot.data?.containsKey('image') == true) { image = snapshot.data['image']; - } else if (channel.state.members.length == 2) { + } else if (channel.state.members?.length == 2) { final otherMember = channel.state.members .firstWhere((member) => member.user.id != client.user.id); image = otherMember.user.extraData['image']; diff --git a/lib/src/typing_indicator.dart b/lib/src/typing_indicator.dart index 57427da6..69a16b98 100644 --- a/lib/src/typing_indicator.dart +++ b/lib/src/typing_indicator.dart @@ -34,7 +34,7 @@ class TypingIndicator extends StatelessWidget { builder: (context, snapshot) { return AnimatedSwitcher( duration: Duration(milliseconds: 300), - child: snapshot.data.isNotEmpty + child: snapshot.data?.isNotEmpty == true ? Align( key: Key('typings'), alignment: alignment, diff --git a/pubspec.yaml b/pubspec.yaml index 35674c61..34a48b8f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -30,3 +30,6 @@ dependencies: dev_dependencies: pedantic: ^1.9.0 + flutter_test: + sdk: flutter + mockito: ^4.1.1 diff --git a/test/src/channel_preview_test.dart b/test/src/channel_preview_test.dart new file mode 100644 index 00000000..f5e0fbd0 --- /dev/null +++ b/test/src/channel_preview_test.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:stream_chat_flutter/stream_chat_flutter.dart'; + +class MockClient extends Mock implements Client {} + +class MockChannel extends Mock implements Channel {} + +class MockChannelState extends Mock implements ChannelClientState {} + +void main() { + testWidgets( + 'it should show basic channel information', + (WidgetTester tester) async { + final client = MockClient(); + final channel = MockChannel(); + final channelState = MockChannelState(); + final lastMessageAt = DateTime.parse('2020-06-22 12:00:00'); + + when(channel.lastMessageAt).thenReturn(lastMessageAt); + when(channel.state).thenReturn(channelState); + when(channel.extraData).thenReturn({ + 'name': 'test name', + }); + when(channelState.unreadCount).thenReturn(1); + when(channelState.lastMessage).thenReturn(Message( + text: 'hello', + )); + + await tester.pumpWidget(MaterialApp( + home: StreamChat( + client: client, + child: StreamChannel( + channel: channel, + child: Scaffold( + body: ChannelPreview( + channel: channel, + ), + ), + ), + ), + )); + + expect(find.text('22/06/2020'), findsOneWidget); + expect(find.text('test name'), findsOneWidget); + expect(find.text('1'), findsOneWidget); + expect(find.text('hello'), findsOneWidget); + expect(find.byType(ChannelImage), findsOneWidget); + }, + ); +} From 42992d0c02e5e79f1f5da80c91d4684f05ef0a77 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 21 Sep 2020 13:19:14 +0200 Subject: [PATCH 17/30] update ci --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6e56f2be..cebff484 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,7 @@ on: - created env: - flutter_version: "1.12.13+hotfix.5" + flutter_version: "1.20.4" jobs: test: From 06129cdd82716eba93747ff7058b9a5932169aa5 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 21 Sep 2020 13:21:33 +0200 Subject: [PATCH 18/30] update ci --- .github/workflows/main.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index cebff484..1860c34c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -11,9 +11,6 @@ on: types: - created -env: - flutter_version: "1.20.4" - jobs: test: runs-on: [ubuntu-latest] @@ -26,9 +23,9 @@ jobs: path: /opt/hostedtoolcache/flutter key: ${{ runner.OS }}-flutter-install-cache-${{ env.flutter_version }} - name: Flutter action - uses: subosito/flutter-action@v1.1.1 + uses: subosito/flutter-action@v1.3.2 with: - flutter-version: ${{ env.flutter_version }} + channel: 'stable' - name: Get dependencies run: flutter pub get - name: Coverage fix From 2b93491cb1326c123975177998ea3e599c9dc306 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 21 Sep 2020 13:23:17 +0200 Subject: [PATCH 19/30] remove dependencies caching --- .github/workflows/main.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1860c34c..4cd593cf 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -16,12 +16,6 @@ jobs: runs-on: [ubuntu-latest] steps: - uses: actions/checkout@v2 - - name: Cache Flutter dependencies - id: cache - uses: actions/cache@v1 - with: - path: /opt/hostedtoolcache/flutter - key: ${{ runner.OS }}-flutter-install-cache-${{ env.flutter_version }} - name: Flutter action uses: subosito/flutter-action@v1.3.2 with: From 127a30b779c3c70443edfcfc9c829b24aa049a08 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 21 Sep 2020 15:05:48 +0200 Subject: [PATCH 20/30] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index d2bd5dd6..7ca34145 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ [![Pub](https://img.shields.io/pub/v/stream_chat_flutter.svg)](https://pub.dartlang.org/packages/stream_chat_flutter) ![](https://img.shields.io/badge/platform-flutter%20%7C%20flutter%20web-ff69b4.svg?style=flat-square) [![Gitter](https://badges.gitter.im/GetStream/stream-chat-flutter.svg)](https://gitter.im/GetStream/stream-chat-flutter?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +![CI](https://github.com/GetStream/stream-chat-flutter/workflows/CI/badge.svg?branch=master) +[![codecov](https://codecov.io/gh/GetStream/stream-chat-flutter/branch/master/graph/badge.svg)](https://codecov.io/gh/GetStream/stream-chat-flutter) From 293ad5c9bf8ef9b92581c19075566d170f90c4a8 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 21 Sep 2020 17:17:13 +0200 Subject: [PATCH 21/30] fix last active on new message --- lib/src/channel_header.dart | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/lib/src/channel_header.dart b/lib/src/channel_header.dart index 5a7a146c..fbac80f1 100644 --- a/lib/src/channel_header.dart +++ b/lib/src/channel_header.dart @@ -120,15 +120,17 @@ class ChannelHeader extends StatelessWidget implements PreferredSizeWidget { stream: channel.lastMessageAtStream, initialData: channel.lastMessageAt, builder: (context, snapshot) { - return (snapshot.data != null) - ? Text( - 'Active ${Jiffy(snapshot.data.toLocal()).fromNow()}', - style: StreamChatTheme.of(context) - .channelTheme - .channelHeaderTheme - .lastMessageAt, - ) - : SizedBox(); + if (snapshot.data == null) { + return SizedBox(); + } + final jiffyDate = Jiffy(snapshot.data?.toLocal()); + return Text( + 'Active ${jiffyDate.isBefore(Jiffy()) ? jiffyDate.fromNow() : 'now'}', + style: StreamChatTheme.of(context) + .channelTheme + .channelHeaderTheme + .lastMessageAt, + ); }, ); } From e72da27051ea55f75398e6425b3d126a9ed5ac65 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 21 Sep 2020 17:17:30 +0200 Subject: [PATCH 22/30] ellipse name if too long --- lib/src/channel_name.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/src/channel_name.dart b/lib/src/channel_name.dart index ef7599b7..96a6a14a 100644 --- a/lib/src/channel_name.dart +++ b/lib/src/channel_name.dart @@ -42,6 +42,7 @@ class ChannelName extends StatelessWidget { return Text( title, style: textStyle, + overflow: TextOverflow.ellipsis, ); }, ); From 1abb108a1524a1a6e206731ec2b5032f2f628eef Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 22 Sep 2020 16:36:40 +0200 Subject: [PATCH 23/30] version bump --- CHANGELOG.md | 5 +++++ lib/src/message_input.dart | 5 ++++- pubspec.yaml | 6 +++--- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c2a43d1..cf901267 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.2.8+1 + +- Update LLC dependency +- Update file_picker dependency + ## 0.2.8 - Update LLC dependency diff --git a/lib/src/message_input.dart b/lib/src/message_input.dart index e0e3104b..4a20600f 100644 --- a/lib/src/message_input.dart +++ b/lib/src/message_input.dart @@ -738,7 +738,10 @@ class MessageInputState extends State { } else if (fileType == DefaultAttachmentTypes.file) { type = FileType.any; } - file = await FilePicker.getFile(type: type); + final res = await FilePicker.platform.pickFiles(type: type); + if (res?.files?.isNotEmpty == true) { + file = File(res.files.first.path); + } } setState(() { diff --git a/pubspec.yaml b/pubspec.yaml index 34a48b8f..6f751342 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_flutter homepage: https://github.com/GetStream/stream-chat-flutter description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter. -version: 0.2.8 +version: 0.2.8+1 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -20,10 +20,10 @@ dependencies: url_launcher: ^5.4.11 video_player: ^0.10.11+1 chewie: ^0.9.10 - file_picker: ^1.12.0 + file_picker: ^2.0.0 image_picker: ^0.6.7+2 flutter_keyboard_visibility: ^3.2.1 - stream_chat: ^0.2.5 + stream_chat: ^0.2.5+1 mime: ^0.9.6+3 visibility_detector: ^0.1.5 http_parser: ^3.1.4 From c418d190ea9fdd2cebb12de45aaea79c7e90b4fe Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 23 Sep 2020 12:07:51 +0200 Subject: [PATCH 24/30] add back button --- lib/src/full_screen_image.dart | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/src/full_screen_image.dart b/lib/src/full_screen_image.dart index c6f5804f..76953b1a 100644 --- a/lib/src/full_screen_image.dart +++ b/lib/src/full_screen_image.dart @@ -15,8 +15,14 @@ class FullScreenImage extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - child: PhotoView( + return Scaffold( + appBar: AppBar( + backgroundColor: Colors.black, + iconTheme: IconThemeData( + color: Colors.white, + ), + ), + body: PhotoView( imageProvider: CachedNetworkImageProvider(url), maxScale: PhotoViewComputedScale.covered, minScale: PhotoViewComputedScale.contained, From e01df9e65f53ceade72f80846951979ac8dad157 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 23 Sep 2020 13:05:59 +0200 Subject: [PATCH 25/30] bump version --- CHANGELOG.md | 4 ++++ pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf901267..6b438a29 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.8+2 + +- Add back button to the full-screen view + ## 0.2.8+1 - Update LLC dependency diff --git a/pubspec.yaml b/pubspec.yaml index 6f751342..8c0f5278 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_flutter homepage: https://github.com/GetStream/stream-chat-flutter description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter. -version: 0.2.8+1 +version: 0.2.8+2 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues From 2bc72bd96e854d0a435cef653c737494d31ebe73 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Wed, 23 Sep 2020 16:42:50 +0200 Subject: [PATCH 26/30] add CreateChannelPage to example --- example/lib/main.dart | 194 +++++++++++++++++++++++++++++++++++++ example/pubspec.yaml | 2 +- lib/src/channels_bloc.dart | 15 ++- pubspec.yaml | 2 +- 4 files changed, 206 insertions(+), 7 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index f81c61be..ca204fe8 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -108,6 +108,14 @@ class ChannelListPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( + floatingActionButton: FloatingActionButton( + child: Icon(Icons.add), + onPressed: () { + Navigator.of(context).push(MaterialPageRoute(builder: (context) { + return CreateChannelPage(); + })); + }, + ), body: ChannelsBloc( child: ChannelListView( filter: { @@ -198,3 +206,189 @@ class ThreadPage extends StatelessWidget { ); } } + +class CreateChannelPage extends StatefulWidget { + @override + _CreateChannelPageState createState() => _CreateChannelPageState(); +} + +class _CreateChannelPageState extends State { + final ScrollController _scrollController = ScrollController(); + Client client; + List users = []; + List selectedUsers = []; + int offset = 0; + bool loading = false; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + elevation: 0, + backgroundColor: Colors.transparent, + title: Text( + 'Create a channel', + style: Theme.of(context).textTheme.headline6, + ), + ), + floatingActionButton: + selectedUsers.isNotEmpty ? _buildFAB(context) : SizedBox(), + body: _buildListView(), + ); + } + + ListView _buildListView() { + return ListView.builder( + controller: _scrollController, + itemBuilder: _itemBuilder, + itemCount: users.length, + ); + } + + Widget _itemBuilder(context, i) { + final user = users[i]; + return ListTile( + onLongPress: () { + _selectUser(user); + }, + selected: selectedUsers.contains(user), + onTap: () { + if (selectedUsers.isNotEmpty) { + return _selectUser(user); + } + _createChannel(context, [user]); + }, + leading: UserAvatar( + user: user, + ), + title: Text(user.name), + ); + } + + Widget _buildFAB(BuildContext context) { + return FloatingActionButton( + child: Icon(Icons.done), + onPressed: () async { + String name; + if (selectedUsers.length > 1) { + name = await _showEnterNameDialog(context); + if (name?.isNotEmpty != true) { + return; + } + } + + _createChannel(context, selectedUsers, name); + }, + ); + } + + Future _showEnterNameDialog(BuildContext context) { + final controller = TextEditingController(); + return showDialog( + context: context, + builder: (context) => SimpleDialog( + contentPadding: const EdgeInsets.all(16), + title: Text('Enter a name for the channel'), + children: [ + TextField( + controller: controller, + decoration: InputDecoration( + border: OutlineInputBorder(), + ), + ), + ButtonBar( + children: [ + FlatButton( + onPressed: () => Navigator.pop(context), + child: Text('Cancel'), + ), + FlatButton( + onPressed: () => Navigator.pop(context, controller.text), + child: Text('Ok'), + ), + ], + ), + ], + ), + ); + } + + Future _createChannel( + BuildContext context, + List users, [ + String name, + ]) async { + final channel = client.channel('messaging', extraData: { + 'members': [ + client.state.user.id, + ...users.map((e) => e.id), + ], + if (name != null) 'name': name, + }); + await channel.watch(); + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) { + return StreamChannel( + child: ChannelPage(), + channel: channel, + ); + }, + ), + ); + } + + void _selectUser(User user) { + if (!selectedUsers.contains(user)) { + setState(() { + selectedUsers.add(user); + }); + } else { + setState(() { + selectedUsers.remove(user); + }); + } + } + + @override + void initState() { + super.initState(); + + client = StreamChat.of(context).client; + + _scrollController.addListener(() async { + if (!loading && + _scrollController.offset >= + _scrollController.position.maxScrollExtent - 100) { + offset += 25; + await _queryUsers(); + } + }); + + _queryUsers(); + } + + Future _queryUsers() { + loading = true; + return client.queryUsers( + pagination: PaginationParams( + limit: 25, + offset: offset, + ), + sort: [ + SortOption( + 'name', + direction: SortOption.ASC, + ), + ], + ).then((value) { + setState(() { + users = [ + ...users, + ...value.users, + ]; + }); + }).whenComplete(() => loading = false); + } +} diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 23beab12..9e62c5e5 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -1,7 +1,7 @@ name: example description: A new Flutter project. -version: 1.0.3+4 +version: 1.0.6+7 environment: sdk: ">=2.2.2 <3.0.0" diff --git a/lib/src/channels_bloc.dart b/lib/src/channels_bloc.dart index cc2d4f93..df6f641b 100644 --- a/lib/src/channels_bloc.dart +++ b/lib/src/channels_bloc.dart @@ -124,18 +124,23 @@ class ChannelsBlocState extends State _subscriptions.add(client.on(EventType.messageNew).listen((e) { final newChannels = List.from(channels ?? []); final index = newChannels.indexWhere((c) => c.cid == e.cid); - if (index > 0) { - final channel = newChannels.removeAt(index); - newChannels.insert(0, channel); - _channelsController.add(newChannels); + if (index > -1) { + if (index > 0) { + final channel = newChannels.removeAt(index); + newChannels.insert(0, channel); + } } else { final hiddenIndex = _hiddenChannels.indexWhere((c) => c.cid == e.cid); if (hiddenIndex > -1) { newChannels.insert(0, _hiddenChannels[hiddenIndex]); _hiddenChannels.removeAt(hiddenIndex); - _channelsController.add(newChannels); + } else { + if (client.state.channels[e.cid] != null) { + newChannels.insert(0, client.state.channels[e.cid]); + } } } + _channelsController.add(newChannels); })); } diff --git a/pubspec.yaml b/pubspec.yaml index 34a48b8f..66a60736 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,7 +23,7 @@ dependencies: file_picker: ^1.12.0 image_picker: ^0.6.7+2 flutter_keyboard_visibility: ^3.2.1 - stream_chat: ^0.2.5 + stream_chat: ^0.2.5+1 mime: ^0.9.6+3 visibility_detector: ^0.1.5 http_parser: ^3.1.4 From b9b5627d9e3b04b55643af0c90863f129d27653b Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Thu, 1 Oct 2020 10:29:16 +0200 Subject: [PATCH 27/30] add back button on full screen video page --- lib/src/full_screen_video.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/src/full_screen_video.dart b/lib/src/full_screen_video.dart index 46325b07..98729243 100644 --- a/lib/src/full_screen_video.dart +++ b/lib/src/full_screen_video.dart @@ -26,6 +26,12 @@ class _FullScreenVideoState extends State { @override Widget build(BuildContext context) { return Scaffold( + appBar: AppBar( + backgroundColor: Colors.black, + iconTheme: IconThemeData( + color: Colors.white, + ), + ), body: Builder( key: _scaffoldKey, builder: (context) { From 933c286db28a25b448eefb52afbfe0cd486ddaa3 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Thu, 1 Oct 2020 15:10:12 +0200 Subject: [PATCH 28/30] version bump --- CHANGELOG.md | 6 ++++++ pubspec.yaml | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b438a29..95b92815 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.2.8+3 + +- Add simple example of channel creation in sample app +- Add back button to the full-screen video view +- Update llc version + ## 0.2.8+2 - Add back button to the full-screen view diff --git a/pubspec.yaml b/pubspec.yaml index 8c0f5278..19d0fb07 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: stream_chat_flutter homepage: https://github.com/GetStream/stream-chat-flutter description: Stream Chat official Flutter SDK. Build your own chat experience using Dart and Flutter. -version: 0.2.8+2 +version: 0.2.8+3 repository: https://github.com/GetStream/stream-chat-flutter issue_tracker: https://github.com/GetStream/stream-chat-flutter/issues @@ -23,7 +23,7 @@ dependencies: file_picker: ^2.0.0 image_picker: ^0.6.7+2 flutter_keyboard_visibility: ^3.2.1 - stream_chat: ^0.2.5+1 + stream_chat: ^0.2.5+2 mime: ^0.9.6+3 visibility_detector: ^0.1.5 http_parser: ^3.1.4 From 90765852a801b18e7bf247e7c1e6204cdb542ea4 Mon Sep 17 00:00:00 2001 From: Deven Joshi Date: Fri, 2 Oct 2020 17:04:07 +0530 Subject: [PATCH 29/30] fix: Removed overflow parameter and migrated to clipBehavior --- lib/src/message_input.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/message_input.dart b/lib/src/message_input.dart index 4a20600f..edc21f96 100644 --- a/lib/src/message_input.dart +++ b/lib/src/message_input.dart @@ -182,7 +182,7 @@ class MessageInputState extends State { child: Padding( padding: const EdgeInsets.all(8.0), child: Stack( - overflow: Overflow.visible, + clipBehavior: Clip.none, children: [ _buildBorder(context), Column( From 149c5dd2eb3f1a198b97bd304b4f40725f252721 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Fri, 2 Oct 2020 15:38:39 +0200 Subject: [PATCH 30/30] comment out notification handling code on ios due to incompatible dependencies --- example/ios/Flutter/.last_build_id | 1 + .../Notifications/NotificationService.swift | 292 +++++++++--------- example/ios/Podfile | 79 +---- example/ios/Podfile.lock | 288 +++++++---------- example/ios/Runner.xcodeproj/project.pbxproj | 54 +++- example/pubspec.yaml | 2 +- 6 files changed, 331 insertions(+), 385 deletions(-) create mode 100644 example/ios/Flutter/.last_build_id diff --git a/example/ios/Flutter/.last_build_id b/example/ios/Flutter/.last_build_id new file mode 100644 index 00000000..082cee61 --- /dev/null +++ b/example/ios/Flutter/.last_build_id @@ -0,0 +1 @@ +62487e5075f4f51e065cb6460a926b6a \ No newline at end of file diff --git a/example/ios/Notifications/NotificationService.swift b/example/ios/Notifications/NotificationService.swift index 7d085536..60e44390 100644 --- a/example/ios/Notifications/NotificationService.swift +++ b/example/ios/Notifications/NotificationService.swift @@ -7,7 +7,7 @@ // import UserNotifications -import StreamChatClient +//import StreamChatClient final class NotificationService: UNNotificationServiceExtension { @@ -26,29 +26,29 @@ final class NotificationService: UNNotificationServiceExtension { return } - Client.config = .init(apiKey: apiKey, logOptions: .error) - Client.shared.set(user: User(id: userId), token: token) { res in - guard res.isConnected else { - return - } - - Client.shared.message(withId: messageId) { [weak self] res in - if let message = res.value?.message, - let channel = res.value?.channel { - let messageWrapper = MessageWrapper(channel: channel, message: message) - if let encodedData = try? JSONEncoder.stream.encode(messageWrapper), - let encodedString = String(data: encodedData, encoding: .utf8) { - let storedMessages = sharedDefaults.stringArray(forKey: "messageQueue") ?? [] - sharedDefaults.setValue(storedMessages + [encodedString], forKey: "messageQueue") - - // Modify the notification content here... - self?.bestAttemptContent?.title = "[modified] \(self?.bestAttemptContent?.title ?? "")" - contentHandler(self?.bestAttemptContent ?? request.content) - } - Client.shared.disconnect() - } - } - } +// Client.config = .init(apiKey: apiKey, logOptions: .error) +// Client.shared.set(user: User(id: userId), token: token) { res in +// guard res.isConnected else { +// return +// } +// +// Client.shared.message(withId: messageId) { [weak self] res in +// if let message = res.value?.message, +// let channel = res.value?.channel { +// let messageWrapper = MessageWrapper(channel: channel, message: message) +// if let encodedData = try? JSONEncoder.stream.encode(messageWrapper), +// let encodedString = String(data: encodedData, encoding: .utf8) { +// let storedMessages = sharedDefaults.stringArray(forKey: "messageQueue") ?? [] +// sharedDefaults.setValue(storedMessages + [encodedString], forKey: "messageQueue") +// +// // Modify the notification content here... +// self?.bestAttemptContent?.title = "[modified] \(self?.bestAttemptContent?.title ?? "")" +// contentHandler(self?.bestAttemptContent ?? request.content) +// } +// Client.shared.disconnect() +// } +// } +// } } override func serviceExtensionTimeWillExpire() { @@ -58,125 +58,125 @@ final class NotificationService: UNNotificationServiceExtension { } } -public struct MessageWrapper: Encodable { - private enum CodingKeys: String, CodingKey { - case id - case channel - case type - case user - case created = "created_at" - case updated = "updated_at" - case text - case command - case args - case attachments - case parentId = "parent_id" - case showReplyInChannel = "show_in_channel" - case mentionedUsers = "mentioned_users" - } - - init(channel: Channel, message: Message) { - id = message.id - type = message.type - user = message.user - created = message.created - updated = message.updated - text = message.text - command = message.command - args = message.args - attachments = message.attachments - parentId = message.parentId - showReplyInChannel = message.showReplyInChannel - mentionedUsers = message.mentionedUsers - extraData = message.extraData - self.channel = ChannelWrapper(channel: channel) - } - - /// A message id. - public let id: String - /// The channel cid. - public let channel: ChannelWrapper? - /// A message type (see `MessageType`). - public let type: MessageType - /// A user (see `User`). - public let user: User - /// A created date. - public let created: Date - /// A updated date. - public let updated: Date - /// A text. - public let text: String - /// A used command name. - public let command: String? - /// A used command args. - public let args: String? - /// Attachments (see `Attachment`). - public let attachments: [Attachment] - /// A parent message id. - public let parentId: String? - /// Check if this reply message needs to show in the channel. - public let showReplyInChannel: Bool - /// Mentioned users (see `User`). - public let mentionedUsers: [User] - /// An extra data for the message. - public let extraData: Codable? -} - -public struct ChannelWrapper: Encodable { - /// Coding keys for the encoding. - private enum CodingKeys: String, CodingKey { - case id - case cid - case type - case name - case imageURL = "image" - case members - case lastMessageDate = "last_message_at" - case createdBy = "created_by" - case created = "created_at" - case deleted = "deleted_at" - case frozen - } - - init(channel: Channel) { - id = channel.id - cid = channel.cid - type = channel.type - name = channel.name - imageURL = channel.imageURL - lastMessageDate = channel.lastMessageDate - created = channel.created - deleted = channel.deleted - createdBy = channel.createdBy - config = channel.config - frozen = channel.frozen - extraData = channel.extraData - } - - /// A channel id. - public let id: String - /// A channel type + id. - public let cid: ChannelId - /// A channel type. - public let type: ChannelType - /// A channel name. - public let name: String? - /// An image of the channel. - public let imageURL: URL? - /// The last message date. - public let lastMessageDate: Date? - /// A channel created date. - public let created: Date - /// A channel deleted date. - public let deleted: Date? - /// A creator of the channel. - public let createdBy: User? - /// A config. - public let config: Channel.Config - /// Checks if the channel is frozen. - public let frozen: Bool - /// A list of user ids of the channel members. - public let members = Set() - /// An extra data for the channel. - public let extraData: Codable? -} +//public struct MessageWrapper: Encodable { +// private enum CodingKeys: String, CodingKey { +// case id +// case channel +// case type +// case user +// case created = "created_at" +// case updated = "updated_at" +// case text +// case command +// case args +// case attachments +// case parentId = "parent_id" +// case showReplyInChannel = "show_in_channel" +// case mentionedUsers = "mentioned_users" +// } +// +// init(channel: Channel, message: Message) { +// id = message.id +// type = message.type +// user = message.user +// created = message.created +// updated = message.updated +// text = message.text +// command = message.command +// args = message.args +// attachments = message.attachments +// parentId = message.parentId +// showReplyInChannel = message.showReplyInChannel +// mentionedUsers = message.mentionedUsers +// extraData = message.extraData +// self.channel = ChannelWrapper(channel: channel) +// } +// +// /// A message id. +// public let id: String +// /// The channel cid. +// public let channel: ChannelWrapper? +// /// A message type (see `MessageType`). +// public let type: MessageType +// /// A user (see `User`). +// public let user: User +// /// A created date. +// public let created: Date +// /// A updated date. +// public let updated: Date +// /// A text. +// public let text: String +// /// A used command name. +// public let command: String? +// /// A used command args. +// public let args: String? +// /// Attachments (see `Attachment`). +// public let attachments: [Attachment] +// /// A parent message id. +// public let parentId: String? +// /// Check if this reply message needs to show in the channel. +// public let showReplyInChannel: Bool +// /// Mentioned users (see `User`). +// public let mentionedUsers: [User] +// /// An extra data for the message. +// public let extraData: Codable? +//} +// +//public struct ChannelWrapper: Encodable { +// /// Coding keys for the encoding. +// private enum CodingKeys: String, CodingKey { +// case id +// case cid +// case type +// case name +// case imageURL = "image" +// case members +// case lastMessageDate = "last_message_at" +// case createdBy = "created_by" +// case created = "created_at" +// case deleted = "deleted_at" +// case frozen +// } +// +// init(channel: Channel) { +// id = channel.id +// cid = channel.cid +// type = channel.type +// name = channel.name +// imageURL = channel.imageURL +// lastMessageDate = channel.lastMessageDate +// created = channel.created +// deleted = channel.deleted +// createdBy = channel.createdBy +// config = channel.config +// frozen = channel.frozen +// extraData = channel.extraData +// } +// +// /// A channel id. +// public let id: String +// /// A channel type + id. +// public let cid: ChannelId +// /// A channel type. +// public let type: ChannelType +// /// A channel name. +// public let name: String? +// /// An image of the channel. +// public let imageURL: URL? +// /// The last message date. +// public let lastMessageDate: Date? +// /// A channel created date. +// public let created: Date +// /// A channel deleted date. +// public let deleted: Date? +// /// A creator of the channel. +// public let createdBy: User? +// /// A config. +// public let config: Channel.Config +// /// Checks if the channel is frozen. +// public let frozen: Bool +// /// A list of user ids of the channel members. +// public let members = Set() +// /// An extra data for the channel. +// public let extraData: Codable? +//} diff --git a/example/ios/Podfile b/example/ios/Podfile index ad84eb7b..63861e27 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -10,81 +10,34 @@ project 'Runner', { 'Release' => :release, } -def parse_KV_file(file, separator='=') - file_abs_path = File.expand_path(file) - if !File.exists? file_abs_path - return []; +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" end - generated_key_values = {} - skip_line_start_symbols = ["#", "/"] - File.foreach(file_abs_path) do |line| - next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } - plugin = line.split(pattern=separator) - if plugin.length == 2 - podname = plugin[0].strip() - path = plugin[1].strip() - podpath = File.expand_path("#{path}", file_abs_path) - generated_key_values[podname] = podpath - else - puts "Invalid plugin specification: #{line}" - end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches end - generated_key_values + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" end +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + target 'Runner' do use_frameworks! use_modular_headers! - - # Flutter Pod - copied_flutter_dir = File.join(__dir__, 'Flutter') - copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework') - copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec') - unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path) - # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet. - # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration. - # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist. - - generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig') - unless File.exist?(generated_xcode_build_settings_path) - raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path) - cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR']; - - unless File.exist?(copied_framework_path) - FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir) - end - unless File.exist?(copied_podspec_path) - FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir) - end - end - - # Keep pod path relative so it can be checked into Podfile.lock. - pod 'Flutter', :path => 'Flutter' - pod 'StreamChatClient' - # Plugin Pods - - # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock - # referring to absolute paths on developers' machines. - system('rm -rf .symlinks') - system('mkdir -p .symlinks/plugins') - plugin_pods = parse_KV_file('../.flutter-plugins') - plugin_pods.each do |name, path| - symlink = File.join('.symlinks', 'plugins', name) - File.symlink(path, symlink) - pod name, :path => File.join(symlink, 'ios') - end + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) end -# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. -install! 'cocoapods', :disable_input_output_paths => true +pod 'StreamChatClient' post_install do |installer| installer.pods_project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings['ENABLE_BITCODE'] = 'NO' - end + flutter_additional_ios_build_settings(target) end end diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index a3821dbf..28b42300 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1,82 +1,74 @@ PODS: - - DKImagePickerController/Core (4.2.2): + - DKImagePickerController/Core (4.3.2): - DKImagePickerController/ImageDataManager - DKImagePickerController/Resource - - DKImagePickerController/ImageDataManager (4.2.2) - - DKImagePickerController/PhotoGallery (4.2.2): + - DKImagePickerController/ImageDataManager (4.3.2) + - DKImagePickerController/PhotoGallery (4.3.2): - DKImagePickerController/Core - DKPhotoGallery - - DKImagePickerController/Resource (4.2.2) - - DKPhotoGallery (0.0.14): - - DKPhotoGallery/Core (= 0.0.14) - - DKPhotoGallery/Model (= 0.0.14) - - DKPhotoGallery/Preview (= 0.0.14) - - DKPhotoGallery/Resource (= 0.0.14) + - DKImagePickerController/Resource (4.3.2) + - DKPhotoGallery (0.0.17): + - DKPhotoGallery/Core (= 0.0.17) + - DKPhotoGallery/Model (= 0.0.17) + - DKPhotoGallery/Preview (= 0.0.17) + - DKPhotoGallery/Resource (= 0.0.17) - SDWebImage - - SDWebImageFLPlugin - - DKPhotoGallery/Core (0.0.14): + - SwiftyGif + - DKPhotoGallery/Core (0.0.17): - DKPhotoGallery/Model - DKPhotoGallery/Preview - SDWebImage - - SDWebImageFLPlugin - - DKPhotoGallery/Model (0.0.14): + - SwiftyGif + - DKPhotoGallery/Model (0.0.17): - SDWebImage - - SDWebImageFLPlugin - - DKPhotoGallery/Preview (0.0.14): + - SwiftyGif + - DKPhotoGallery/Preview (0.0.17): - DKPhotoGallery/Model - DKPhotoGallery/Resource - SDWebImage - - SDWebImageFLPlugin - - DKPhotoGallery/Resource (0.0.14): + - SwiftyGif + - DKPhotoGallery/Resource (0.0.17): - SDWebImage - - SDWebImageFLPlugin + - SwiftyGif - file_picker (0.0.1): - DKImagePickerController/PhotoGallery - Flutter - - Firebase/Core (6.20.0): + - Firebase/CoreOnly (6.26.0): + - FirebaseCore (= 6.7.2) + - Firebase/Messaging (6.26.0): - Firebase/CoreOnly - - FirebaseAnalytics (= 6.3.1) - - Firebase/CoreOnly (6.20.0): - - FirebaseCore (= 6.6.4) - - Firebase/Messaging (6.20.0): - - Firebase/CoreOnly - - FirebaseMessaging (~> 4.3.0) - - firebase_messaging (0.0.1): - - Firebase/Core - - Firebase/Messaging + - FirebaseMessaging (~> 4.4.1) + - firebase_core (0.5.0): + - Firebase/CoreOnly (~> 6.26.0) + - Flutter + - firebase_messaging (7.0.2): + - Firebase/CoreOnly (~> 6.26.0) + - Firebase/Messaging (~> 6.26.0) + - firebase_core - Flutter - - FirebaseAnalytics (6.3.1): - - FirebaseCore (~> 6.6) - - FirebaseInstallations (~> 1.1) - - GoogleAppMeasurement (= 6.3.1) - - GoogleUtilities/AppDelegateSwizzler (~> 6.0) - - GoogleUtilities/MethodSwizzler (~> 6.0) - - GoogleUtilities/Network (~> 6.0) - - "GoogleUtilities/NSData+zlib (~> 6.0)" - - nanopb (= 0.3.9011) - FirebaseAnalyticsInterop (1.5.0) - - FirebaseCore (6.6.4): - - FirebaseCoreDiagnostics (~> 1.2) + - FirebaseCore (6.7.2): + - FirebaseCoreDiagnostics (~> 1.3) - FirebaseCoreDiagnosticsInterop (~> 1.2) - GoogleUtilities/Environment (~> 6.5) - GoogleUtilities/Logger (~> 6.5) - - FirebaseCoreDiagnostics (1.2.2): - - FirebaseCoreDiagnosticsInterop (~> 1.2) - - GoogleDataTransportCCTSupport (~> 2.0) - - GoogleUtilities/Environment (~> 6.5) - - GoogleUtilities/Logger (~> 6.5) - - nanopb (~> 0.3.901) + - FirebaseCoreDiagnostics (1.7.0): + - GoogleDataTransport (~> 7.4) + - GoogleUtilities/Environment (~> 6.7) + - GoogleUtilities/Logger (~> 6.7) + - nanopb (~> 1.30906.0) - FirebaseCoreDiagnosticsInterop (1.2.0) - - FirebaseInstallations (1.1.0): + - FirebaseInstallations (1.3.0): - FirebaseCore (~> 6.6) - - GoogleUtilities/UserDefaults (~> 6.5) + - GoogleUtilities/Environment (~> 6.6) + - GoogleUtilities/UserDefaults (~> 6.6) - PromisesObjC (~> 1.2) - - FirebaseInstanceID (4.3.2): + - FirebaseInstanceID (4.3.4): - FirebaseCore (~> 6.6) - FirebaseInstallations (~> 1.0) - GoogleUtilities/Environment (~> 6.5) - GoogleUtilities/UserDefaults (~> 6.5) - - FirebaseMessaging (4.3.0): + - FirebaseMessaging (4.4.1): - FirebaseAnalyticsInterop (~> 1.5) - FirebaseCore (~> 6.6) - FirebaseInstanceID (~> 4.3) @@ -85,119 +77,99 @@ PODS: - GoogleUtilities/Reachability (~> 6.5) - GoogleUtilities/UserDefaults (~> 6.5) - Protobuf (>= 3.9.2, ~> 3.9) - - FLAnimatedImage (1.0.12) - Flutter (1.0.0) - flutter_apns (0.0.1): - Flutter - - flutter_keyboard_visibility (0.7.0): + - flutter_keyboard_visibility (0.0.1): - Flutter - flutter_local_notifications (0.0.1): - Flutter - - flutter_plugin_android_lifecycle (0.0.1): - - Flutter - FMDB (2.7.5): - FMDB/standard (= 2.7.5) - FMDB/standard (2.7.5) - - GoogleAppMeasurement (6.3.1): - - GoogleUtilities/AppDelegateSwizzler (~> 6.0) - - GoogleUtilities/MethodSwizzler (~> 6.0) - - GoogleUtilities/Network (~> 6.0) - - "GoogleUtilities/NSData+zlib (~> 6.0)" - - nanopb (= 0.3.9011) - - GoogleDataTransport (5.0.0) - - GoogleDataTransportCCTSupport (2.0.0): - - GoogleDataTransport (~> 5.0) - - nanopb (~> 0.3.901) - - GoogleUtilities/AppDelegateSwizzler (6.5.2): + - GoogleDataTransport (7.4.0): + - nanopb (~> 1.30906.0) + - GoogleUtilities/AppDelegateSwizzler (6.7.2): - GoogleUtilities/Environment - GoogleUtilities/Logger - GoogleUtilities/Network - - GoogleUtilities/Environment (6.5.2) - - GoogleUtilities/Logger (6.5.2): + - GoogleUtilities/Environment (6.7.2): + - PromisesObjC (~> 1.2) + - GoogleUtilities/Logger (6.7.2): - GoogleUtilities/Environment - - GoogleUtilities/MethodSwizzler (6.5.2): - - GoogleUtilities/Logger - - GoogleUtilities/Network (6.5.2): + - GoogleUtilities/Network (6.7.2): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (6.5.2)" - - GoogleUtilities/Reachability (6.5.2): + - "GoogleUtilities/NSData+zlib (6.7.2)" + - GoogleUtilities/Reachability (6.7.2): - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (6.5.2): + - GoogleUtilities/UserDefaults (6.7.2): - GoogleUtilities/Logger - - GzipSwift (5.1.1) - image_picker (0.0.1): - Flutter - - moor_ffi (0.0.1): - - Flutter - - nanopb (0.3.9011): - - nanopb/decode (= 0.3.9011) - - nanopb/encode (= 0.3.9011) - - nanopb/decode (0.3.9011) - - nanopb/encode (0.3.9011) + - nanopb (1.30906.0): + - nanopb/decode (= 1.30906.0) + - nanopb/encode (= 1.30906.0) + - nanopb/decode (1.30906.0) + - nanopb/encode (1.30906.0) - path_provider (0.0.1): - Flutter - - path_provider_macos (0.0.1): - - Flutter - - PromisesObjC (1.2.8) - - Protobuf (3.11.4) - - ReachabilitySwift (5.0.0) - - SDWebImage (5.8.0): - - SDWebImage/Core (= 5.8.0) - - SDWebImage/Core (5.8.0) - - SDWebImageFLPlugin (0.4.0): - - FLAnimatedImage (>= 1.0.11) - - SDWebImage/Core (~> 5.6) + - PromisesObjC (1.2.10) + - Protobuf (3.13.0) + - SDWebImage (5.9.2): + - SDWebImage/Core (= 5.9.2) + - SDWebImage/Core (5.9.2) - shared_preferences (0.0.1): - Flutter - - shared_preferences_macos (0.0.1): - - Flutter - - shared_preferences_web (0.0.1): - - Flutter - sqflite (0.0.1): - Flutter - FMDB (~> 2.7.2) - - Starscream (3.1.1) - - StreamChatClient (2.0.1): - - GzipSwift (~> 5.1) - - ReachabilitySwift (~> 5.0) - - Starscream (~> 3.1) + - sqlite3 (3.32.3): + - sqlite3/common (= 3.32.3) + - sqlite3/common (3.32.3) + - sqlite3/fts5 (3.32.3): + - sqlite3/common + - sqlite3/json1 (3.32.3): + - sqlite3/common + - sqlite3/perf-threadsafe (3.32.3): + - sqlite3/common + - sqlite3/rtree (3.32.3): + - sqlite3/common + - sqlite3_flutter_libs (0.0.1): + - Flutter + - sqlite3 (~> 3.32.3) + - sqlite3/fts5 + - sqlite3/json1 + - sqlite3/perf-threadsafe + - sqlite3/rtree + - Starscream (4.0.4) + - StreamChatClient (2.4.0): + - Starscream (~> 4.0) + - SwiftyGif (5.3.0) - url_launcher (0.0.1): - Flutter - - url_launcher_macos (0.0.1): - - Flutter - - url_launcher_web (0.0.1): - - Flutter - video_player (0.0.1): - Flutter - - video_player_web (0.0.1): - - Flutter - wakelock (0.0.1): - Flutter DEPENDENCIES: - file_picker (from `.symlinks/plugins/file_picker/ios`) + - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - Flutter (from `Flutter`) - flutter_apns (from `.symlinks/plugins/flutter_apns/ios`) - flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - - flutter_plugin_android_lifecycle (from `.symlinks/plugins/flutter_plugin_android_lifecycle/ios`) - image_picker (from `.symlinks/plugins/image_picker/ios`) - - moor_ffi (from `.symlinks/plugins/moor_ffi/ios`) - path_provider (from `.symlinks/plugins/path_provider/ios`) - - path_provider_macos (from `.symlinks/plugins/path_provider_macos/ios`) - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - - shared_preferences_macos (from `.symlinks/plugins/shared_preferences_macos/ios`) - - shared_preferences_web (from `.symlinks/plugins/shared_preferences_web/ios`) - sqflite (from `.symlinks/plugins/sqflite/ios`) + - sqlite3_flutter_libs (from `.symlinks/plugins/sqlite3_flutter_libs/ios`) - StreamChatClient - url_launcher (from `.symlinks/plugins/url_launcher/ios`) - - url_launcher_macos (from `.symlinks/plugins/url_launcher_macos/ios`) - - url_launcher_web (from `.symlinks/plugins/url_launcher_web/ios`) - video_player (from `.symlinks/plugins/video_player/ios`) - - video_player_web (from `.symlinks/plugins/video_player_web/ios`) - wakelock (from `.symlinks/plugins/wakelock/ios`) SPEC REPOS: @@ -205,7 +177,6 @@ SPEC REPOS: - DKImagePickerController - DKPhotoGallery - Firebase - - FirebaseAnalytics - FirebaseAnalyticsInterop - FirebaseCore - FirebaseCoreDiagnostics @@ -213,25 +184,23 @@ SPEC REPOS: - FirebaseInstallations - FirebaseInstanceID - FirebaseMessaging - - FLAnimatedImage - FMDB - - GoogleAppMeasurement - GoogleDataTransport - - GoogleDataTransportCCTSupport - GoogleUtilities - - GzipSwift - nanopb - PromisesObjC - Protobuf - - ReachabilitySwift - SDWebImage - - SDWebImageFLPlugin + - sqlite3 - Starscream - StreamChatClient + - SwiftyGif EXTERNAL SOURCES: file_picker: :path: ".symlinks/plugins/file_picker/ios" + firebase_core: + :path: ".symlinks/plugins/firebase_core/ios" firebase_messaging: :path: ".symlinks/plugins/firebase_messaging/ios" Flutter: @@ -242,86 +211,61 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/flutter_keyboard_visibility/ios" flutter_local_notifications: :path: ".symlinks/plugins/flutter_local_notifications/ios" - flutter_plugin_android_lifecycle: - :path: ".symlinks/plugins/flutter_plugin_android_lifecycle/ios" image_picker: :path: ".symlinks/plugins/image_picker/ios" - moor_ffi: - :path: ".symlinks/plugins/moor_ffi/ios" path_provider: :path: ".symlinks/plugins/path_provider/ios" - path_provider_macos: - :path: ".symlinks/plugins/path_provider_macos/ios" shared_preferences: :path: ".symlinks/plugins/shared_preferences/ios" - shared_preferences_macos: - :path: ".symlinks/plugins/shared_preferences_macos/ios" - shared_preferences_web: - :path: ".symlinks/plugins/shared_preferences_web/ios" sqflite: :path: ".symlinks/plugins/sqflite/ios" + sqlite3_flutter_libs: + :path: ".symlinks/plugins/sqlite3_flutter_libs/ios" url_launcher: :path: ".symlinks/plugins/url_launcher/ios" - url_launcher_macos: - :path: ".symlinks/plugins/url_launcher_macos/ios" - url_launcher_web: - :path: ".symlinks/plugins/url_launcher_web/ios" video_player: :path: ".symlinks/plugins/video_player/ios" - video_player_web: - :path: ".symlinks/plugins/video_player_web/ios" wakelock: :path: ".symlinks/plugins/wakelock/ios" SPEC CHECKSUMS: - DKImagePickerController: 4a3e7948a848c4348e600b3fe5ce41478835fa10 - DKPhotoGallery: 0290d32343574f06eaa4c26f8f2f8a1035e916be + DKImagePickerController: b5eb7f7a388e4643264105d648d01f727110fc3d + DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 file_picker: 3e6c3790de664ccf9b882732d9db5eaf6b8d4eb1 - Firebase: fe7f74012742ab403451dd283e6909b8f1fb348a - firebase_messaging: 21344b3b3a7d9d325d63a70e3750c0c798fe1e03 - FirebaseAnalytics: 572e467f3d977825266e8ccd52674aa3e6f47eac + Firebase: 7cf5f9c67f03cb3b606d1d6535286e1080e57eb6 + firebase_core: 3134fe79d257d430f163b558caf52a10a87efe8a + firebase_messaging: 2844c37f9ce87c0904b38fe435223161b1a71528 FirebaseAnalyticsInterop: 3f86269c38ae41f47afeb43ebf32a001f58fcdae - FirebaseCore: ed0a24c758a57c2b88c5efa8e6a8195e868af589 - FirebaseCoreDiagnostics: e9b4cd8ba60dee0f2d13347332e4b7898cca5b61 + FirebaseCore: f42e5e5f382cdcf6b617ed737bf6c871a6947b17 + FirebaseCoreDiagnostics: 770ac5958e1372ce67959ae4b4f31d8e127c3ac1 FirebaseCoreDiagnosticsInterop: 296e2c5f5314500a850ad0b83e9e7c10b011a850 - FirebaseInstallations: 575cd32f2aec0feeb0e44f5d0110a09e5e60b47b - FirebaseInstanceID: 7ee0d6777013bb952f377b41965bf132b6a075be - FirebaseMessaging: 4ec33842d36b3319e062e51fb8b35a74f726950d - FLAnimatedImage: 4a0b56255d9b05f18b6dd7ee06871be5d3b89e31 + FirebaseInstallations: 6f5f680e65dc374397a483c32d1799ba822a395b + FirebaseInstanceID: cef67c4967c7cecb56ea65d8acbb4834825c587b + FirebaseMessaging: 29543feb343b09546ab3aa04d008ee8595b43c44 Flutter: 0e3d915762c693b495b44d77113d4970485de6ec flutter_apns: f516b118e423fe7c0a38771180549c4d6cb67c2f - flutter_keyboard_visibility: 6195387fb6d8f46e5cd6dda4a4154e41f800f545 + flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069 flutter_local_notifications: 9e4738ce2471c5af910d961a6b7eadcf57c50186 - flutter_plugin_android_lifecycle: dc0b544e129eebb77a6bfb1239d4d1c673a60a35 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a - GoogleAppMeasurement: c29d405ff76e18551b5d158eaba6753fda8c7542 - GoogleDataTransport: a857c6a002d201b524dd4bc2ed7e7355ed07e785 - GoogleDataTransportCCTSupport: 32f75fbe904c82772fcbb6b6bd4525bfb6f2a862 - GoogleUtilities: ad0f3b691c67909d03a3327cc205222ab8f42e0e - GzipSwift: 893f3e48e597a1a4f62fafcb6514220fcf8287fa - image_picker: 66aa71bc96850a90590a35d4c4a2907b0d823109 - moor_ffi: d66c9470c18e9cb333423bbcb493c105c6c774c6 - nanopb: 18003b5e52dab79db540fe93fe9579f399bd1ccd + GoogleDataTransport: b7f406340a291370045a270c599e53c6fa6ec20f + GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3 + image_picker: 9c3312491f862b28d21ecd8fdf0ee14e601b3f09 + nanopb: 59317e09cf1f1a0af72f12af412d54edf52603fc path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c - path_provider_macos: f760a3c5b04357c380e2fddb6f9db6f3015897e0 - PromisesObjC: c119f3cd559f50b7ae681fa59dc1acd19173b7e6 - Protobuf: 176220c526ad8bd09ab1fb40a978eac3fef665f7 - ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 - SDWebImage: 84000f962cbfa70c07f19d2234cbfcf5d779b5dc - SDWebImageFLPlugin: 6c2295fb1242d44467c6c87dc5db6b0a13228fd8 + PromisesObjC: b14b1c6b68e306650688599de8a45e49fae81151 + Protobuf: 3dac39b34a08151c6d949560efe3f86134a3f748 + SDWebImage: 0b42b8719ab0c5257177d5894306e8a336b21cbb shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d - shared_preferences_macos: f3f29b71ccbb56bf40c9dd6396c9acf15e214087 - shared_preferences_web: 141cce0c3ed1a1c5bf2a0e44f52d31eeb66e5ea9 sqflite: 4001a31ff81d210346b500c55b17f4d6c7589dd0 - Starscream: 4bb2f9942274833f7b4d296a55504dcfc7edb7b0 - StreamChatClient: 91b0f585e7dc92ade58e657daffafb16d485b2a6 + sqlite3: 8f7d2078ae27778699a622a94b853285793422a2 + sqlite3_flutter_libs: 5651f8ff48e3b44d910863c4ea5916085b1b245f + Starscream: 5178aed56b316f13fa3bc55694e583d35dd414d9 + StreamChatClient: 8c83a141e753e45fa096ff56d4b782d59e46f251 + SwiftyGif: e466e86c660d343357ab944a819a101c4127cb40 url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef - url_launcher_macos: fd7894421cd39320dce5f292fc99ea9270b2a313 - url_launcher_web: e5527357f037c87560776e36436bf2b0288b965c video_player: 9cc823b1d9da7e8427ee591e8438bfbcde500e6e - video_player_web: da8cadb8274ed4f8dbee8d7171b420dedd437ce7 wakelock: 0d4a70faf8950410735e3f61fb15d517c8a6efc4 -PODFILE CHECKSUM: 5cc7e2f1316491ee530029e2e8391f4100d41fbd +PODFILE CHECKSUM: eb001256612a59f8f9e4d083ad8b9671e69dd184 COCOAPODS: 1.8.4 diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index 456c5e1f..58907d4a 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -308,9 +308,60 @@ files = ( ); inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/Starscream-framework/Starscream.framework", + "${BUILT_PRODUCTS_DIR}/StreamChatClient-framework/StreamChatClient.framework", + "${BUILT_PRODUCTS_DIR}/DKImagePickerController/DKImagePickerController.framework", + "${BUILT_PRODUCTS_DIR}/DKPhotoGallery/DKPhotoGallery.framework", + "${BUILT_PRODUCTS_DIR}/FMDB/FMDB.framework", + "${PODS_ROOT}/../Flutter/Flutter.framework", + "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", + "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework", + "${BUILT_PRODUCTS_DIR}/Protobuf/Protobuf.framework", + "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework", + "${BUILT_PRODUCTS_DIR}/SwiftyGif/SwiftyGif.framework", + "${BUILT_PRODUCTS_DIR}/file_picker/file_picker.framework", + "${BUILT_PRODUCTS_DIR}/flutter_apns/flutter_apns.framework", + "${BUILT_PRODUCTS_DIR}/flutter_keyboard_visibility/flutter_keyboard_visibility.framework", + "${BUILT_PRODUCTS_DIR}/flutter_local_notifications/flutter_local_notifications.framework", + "${BUILT_PRODUCTS_DIR}/image_picker/image_picker.framework", + "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", + "${BUILT_PRODUCTS_DIR}/path_provider/path_provider.framework", + "${BUILT_PRODUCTS_DIR}/shared_preferences/shared_preferences.framework", + "${BUILT_PRODUCTS_DIR}/sqflite/sqflite.framework", + "${BUILT_PRODUCTS_DIR}/sqlite3/sqlite3.framework", + "${BUILT_PRODUCTS_DIR}/sqlite3_flutter_libs/sqlite3_flutter_libs.framework", + "${BUILT_PRODUCTS_DIR}/url_launcher/url_launcher.framework", + "${BUILT_PRODUCTS_DIR}/video_player/video_player.framework", + "${BUILT_PRODUCTS_DIR}/wakelock/wakelock.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Starscream.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/StreamChatClient.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DKImagePickerController.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DKPhotoGallery.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FMDB.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Protobuf.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyGif.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/file_picker.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_apns.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_keyboard_visibility.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_local_notifications.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/image_picker.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqflite.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqlite3.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqlite3_flutter_libs.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/video_player.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/wakelock.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -489,7 +540,6 @@ }; 249021D3217E4FDB00AE95B9 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -573,7 +623,6 @@ }; 97C147031CF9000F007C117D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -629,7 +678,6 @@ }; 97C147041CF9000F007C117D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 9e62c5e5..fe31540a 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -1,7 +1,7 @@ name: example description: A new Flutter project. -version: 1.0.6+7 +version: 1.0.7+8 environment: sdk: ">=2.2.2 <3.0.0"