From 0f07e1a9712a36e224e9c809c4bf87fb54ed0152 Mon Sep 17 00:00:00 2001 From: Jan Lewandowski <54906276+iasiu@users.noreply.github.com> Date: Fri, 21 Jul 2023 10:44:29 +0200 Subject: [PATCH] Stable release and move bloc related APIs to comms package (#61) * Stable release and move bloc related APIs to comms package - update changelog and pubspec version - bump sdk constraint, bump packages, remove uuid package - add README - remove bloc related APIs which were moved to comms package Closes #59 * Update flutter_comms workflows * Update pubspec flutter constraint * Set publish dart sdk to 3.0.6 --- .github/workflows/comms-publish.yaml | 2 +- .github/workflows/flutter_comms-prepare.yaml | 4 +- .github/workflows/flutter_comms-publish.yaml | 2 +- packages/flutter_comms/CHANGELOG.md | 4 + packages/flutter_comms/README.md | 80 ++++++++++++++++++- packages/flutter_comms/lib/flutter_comms.dart | 3 - .../flutter_comms/lib/src/listener_bloc.dart | 29 ------- .../flutter_comms/lib/src/listener_cubit.dart | 31 ------- .../flutter_comms/lib/src/state_sender.dart | 14 ---- packages/flutter_comms/pubspec.yaml | 16 ++-- .../test/flutter_comms_test.dart | 74 +---------------- .../test/listeners/product_count_cubit.dart | 34 -------- .../test/senders/basket_cubit.dart | 18 ----- 13 files changed, 96 insertions(+), 215 deletions(-) delete mode 100644 packages/flutter_comms/lib/src/listener_bloc.dart delete mode 100644 packages/flutter_comms/lib/src/listener_cubit.dart delete mode 100644 packages/flutter_comms/lib/src/state_sender.dart delete mode 100644 packages/flutter_comms/test/listeners/product_count_cubit.dart delete mode 100644 packages/flutter_comms/test/senders/basket_cubit.dart diff --git a/.github/workflows/comms-publish.yaml b/.github/workflows/comms-publish.yaml index 65f20a5..b466220 100644 --- a/.github/workflows/comms-publish.yaml +++ b/.github/workflows/comms-publish.yaml @@ -23,7 +23,7 @@ jobs: - name: Install Dart uses: dart-lang/setup-dart@v1 with: - sdk: 3.0.0 + sdk: 3.0.6 - name: Install mobile-tools uses: actions/checkout@v3 diff --git a/.github/workflows/flutter_comms-prepare.yaml b/.github/workflows/flutter_comms-prepare.yaml index 448db90..eedaca7 100644 --- a/.github/workflows/flutter_comms-prepare.yaml +++ b/.github/workflows/flutter_comms-prepare.yaml @@ -19,7 +19,7 @@ jobs: strategy: fail-fast: false matrix: - flutter-version: ['3.3.x', '3.7.x', '3.10.x'] + flutter-version: ['3.10.x'] defaults: run: @@ -45,4 +45,4 @@ jobs: run: flutter test - name: flutter format - run: flutter format --set-exit-if-changed . + run: dart format --set-exit-if-changed . diff --git a/.github/workflows/flutter_comms-publish.yaml b/.github/workflows/flutter_comms-publish.yaml index 661f402..6245bdb 100644 --- a/.github/workflows/flutter_comms-publish.yaml +++ b/.github/workflows/flutter_comms-publish.yaml @@ -23,7 +23,7 @@ jobs: - name: Install Dart uses: dart-lang/setup-dart@v1 with: - sdk: 2.17.0 + sdk: 3.0.6 - name: Install mobile-tools uses: actions/checkout@v3 diff --git a/packages/flutter_comms/CHANGELOG.md b/packages/flutter_comms/CHANGELOG.md index 66c6d76..599dad3 100644 --- a/packages/flutter_comms/CHANGELOG.md +++ b/packages/flutter_comms/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.0 + +- Move bloc related apis to comms package, add README (#61) + ## 0.0.6+2 - Fix `StateSender` to only send messages when state is actually emitted diff --git a/packages/flutter_comms/README.md b/packages/flutter_comms/README.md index 87ae7ca..5bbe3b1 100644 --- a/packages/flutter_comms/README.md +++ b/packages/flutter_comms/README.md @@ -1,3 +1,81 @@ # flutter_comms -Simple communication pattern abstraction on streams, created for communication between blocs and or widgets. +[![codestyle][pub_badge_style]][pub_badge_link] + +`flutter_comms` builds on top of [comms], making it easier to implement comms pattern +in Flutter projects. + +For use in dart only projects, use [comms]. + +## Installation + +```console +$ flutter pub add flutter_comms +``` + +## Basic usage + +You can mix in `Listener` and `Sender` mixins to widgets but for more convenience +helper widgets have been prepared. + +### MessageListener + +A `MessageListener` works exactly like `Listener` but calls `listen` and `cancel` +functions for you, enabling it to receive messages from any `Sender`sharing the +same message type. + +```dart +MessageListener( + onMessage: (message) { + // handle received messages + }, + onIntialMessage: (message) { + // handle initial message + }, + child: Widget(), +) +``` + +### MultiMessageListener + +Merges multiple `MessageListener` widgets, improving the readability of +nested `MessageListener`s. + +```dart +MultiMessageListener( + listeners: [ + MessageListener( + onMessage: (message) {}, + ), + MessageListener( + onMessage: (message) {}, + ), + ], + child: Widget(), +) +``` + +### useMessageListener + +`useMessageListener` hook calls `onMessage` everytime a message of type `Message` +is received. Works similarly to `Listener` but handles starting message receiving +and cleaning up itself. + +This hook will receive messages only when `HookWidget` using it is built. + +```dart +Widget build(BuildContext context) { + useMessageListener( + (message) { + // handle received messages + }, + onInitialMessage: (message) { + // handle initial message + } + ); +} +``` + +[pub_badge_style]: https://img.shields.io/badge/style-leancode__lint-black +[pub_badge_link]: https://pub.dartlang.org/packages/leancode_lint +[comms]: https://pub.dev/packages/comms diff --git a/packages/flutter_comms/lib/flutter_comms.dart b/packages/flutter_comms/lib/flutter_comms.dart index bce1608..901bfbe 100644 --- a/packages/flutter_comms/lib/flutter_comms.dart +++ b/packages/flutter_comms/lib/flutter_comms.dart @@ -1,8 +1,5 @@ export 'package:comms/comms.dart'; -export 'src/listener_bloc.dart'; -export 'src/listener_cubit.dart'; -export 'src/state_sender.dart'; export 'src/use_message_listener.dart'; export 'src/widgets/message_listener.dart'; export 'src/widgets/multi_message_listener.dart'; diff --git a/packages/flutter_comms/lib/src/listener_bloc.dart b/packages/flutter_comms/lib/src/listener_bloc.dart deleted file mode 100644 index 75ad9e1..0000000 --- a/packages/flutter_comms/lib/src/listener_bloc.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:bloc/bloc.dart'; -import 'package:comms/comms.dart'; -import 'package:meta/meta.dart' show mustCallSuper; - -/// Handles [Listener]'s [listen] and [close]. -/// -/// If your bloc needs to extend another class use [Listener] mixin. -/// -/// Type argument [Message] marks what type of messages can be received. -/// -/// See also: -/// -/// * ListenerCubit, a class extending [Cubit] which handles calling [listen] -/// and [cancel] automatically. -/// * useMessageListener, a hook that provides [Listener]'s functionality -/// which handles calling [listen] and [cancel] automatically. -abstract class ListenerBloc extends Bloc - with Listener { - ListenerBloc(super.initialState) { - super.listen(); - } - - @override - @mustCallSuper - Future close() { - super.cancel(); - return super.close(); - } -} diff --git a/packages/flutter_comms/lib/src/listener_cubit.dart b/packages/flutter_comms/lib/src/listener_cubit.dart deleted file mode 100644 index 4584827..0000000 --- a/packages/flutter_comms/lib/src/listener_cubit.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:bloc/bloc.dart'; -import 'package:comms/comms.dart'; -import 'package:meta/meta.dart' show mustCallSuper; - -/// Handles [Listener]'s [listen] and [close]. -/// -/// Use instead of [Cubit]. -/// -/// If your cubit needs to extend another class use [Listener] mixin. -/// -/// Type argument [Message] marks what type of messages can be received. -/// -/// See also: -/// -/// * ListenerBloc, a class extending [Bloc] which handles calling [listen] -/// and [cancel] automatically. -/// * useMessageListener, a hook that provides [Listener]'s functionality -/// which handles calling [listen] and [cancel] automatically. -abstract class ListenerCubit extends Cubit - with Listener { - ListenerCubit(super.initialState) { - super.listen(); - } - - @override - @mustCallSuper - Future close() { - super.cancel(); - return super.close(); - } -} diff --git a/packages/flutter_comms/lib/src/state_sender.dart b/packages/flutter_comms/lib/src/state_sender.dart deleted file mode 100644 index c50c773..0000000 --- a/packages/flutter_comms/lib/src/state_sender.dart +++ /dev/null @@ -1,14 +0,0 @@ -import 'package:bloc/bloc.dart'; -import 'package:comms/comms.dart'; -import 'package:flutter_comms/flutter_comms.dart'; -import 'package:meta/meta.dart' show mustCallSuper; - -/// Sends emitted [State]s to all [Listener]s of type [State]. -mixin StateSender on BlocBase { - @override - @mustCallSuper - void onChange(Change change) { - super.onChange(change); - getSend()(change.nextState); - } -} diff --git a/packages/flutter_comms/pubspec.yaml b/packages/flutter_comms/pubspec.yaml index 46d89f8..2d0a559 100644 --- a/packages/flutter_comms/pubspec.yaml +++ b/packages/flutter_comms/pubspec.yaml @@ -1,24 +1,22 @@ name: flutter_comms description: Simple communication pattern abstraction on streams, created for communication between blocs and or widgets. -version: 0.0.6+2 +version: 1.0.0 homepage: https://github.com/leancodepl/comms environment: - sdk: ">=2.17.0 <3.0.0" - flutter: ">=3.0.0 <4.0.0" + sdk: ">=3.0.0 <4.0.0" + flutter: ">=3.10.0 <4.0.0" dependencies: - bloc: ^8.1.0 - comms: ^0.0.9 + comms: ^1.0.1 flutter: sdk: flutter flutter_hooks: ^0.18.2 - logging: ^1.0.2 - meta: ^1.7.0 + logging: ^1.2.0 + meta: ^1.9.1 nested: ^1.0.0 - uuid: ^3.0.6 dev_dependencies: flutter_test: sdk: flutter - leancode_lint: ^2.1.0+1 + leancode_lint: ^4.0.0+1 diff --git a/packages/flutter_comms/test/flutter_comms_test.dart b/packages/flutter_comms/test/flutter_comms_test.dart index 5a0c750..a76f083 100644 --- a/packages/flutter_comms/test/flutter_comms_test.dart +++ b/packages/flutter_comms/test/flutter_comms_test.dart @@ -1,77 +1,7 @@ -import 'package:comms/comms.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'listeners/product_count_cubit.dart'; -import 'senders/basket_cubit.dart'; - -int numberOfProductCountMessageSink() => - MessageSinkRegister().getSinksOfType().length; - void main() { - group('ListenerCubit - Sender:', () { - test( - 'ProductCountListenerCubit message sink is added to register after constructor', - () async { - final cubit = ProductCountListenerCubit(); - expect(numberOfProductCountMessageSink(), 1); - await cubit.close(); - }, - ); - - test( - 'ProductCountListenerCubit message sink is removed from register after close', - () async { - final cubit = ProductCountListenerCubit(); - expect(numberOfProductCountMessageSink(), 1); - await cubit.close(); - expect(numberOfProductCountMessageSink(), 0); - }, - ); - - test( - 'ProductCountListenerCubit state is consistent with number of elements in BasketCubit state', - () async { - final basketCubit = BasketCubit(); - final productCountCubit = ProductCountListenerCubit(); - - basketCubit - ..add('T-shirt') - ..add('Socks'); - await Future.delayed(Duration.zero); - - expect(productCountCubit.state, basketCubit.state.length); - - basketCubit.removeLast(); - await Future.delayed(Duration.zero); - - expect(productCountCubit.state, basketCubit.state.length); - - await basketCubit.close(); - await productCountCubit.close(); - }, - ); - - test( - 'ProductCountListenerCubit correctly sets initial state using buffered message', - () async { - final basketCubit = BasketCubit()..add('Jeans'); - final productCountCubit = ProductCountListenerCubit(); - - basketCubit - ..add('T-shirt') - ..add('Socks'); - await Future.delayed(Duration.zero); - - expect(productCountCubit.state, basketCubit.state.length); - - basketCubit.removeLast(); - await Future.delayed(Duration.zero); - - expect(productCountCubit.state, basketCubit.state.length); - - await basketCubit.close(); - await productCountCubit.close(); - }, - ); + test('', () { + expect(2 + 2, 4); }); } diff --git a/packages/flutter_comms/test/listeners/product_count_cubit.dart b/packages/flutter_comms/test/listeners/product_count_cubit.dart deleted file mode 100644 index 5a41a29..0000000 --- a/packages/flutter_comms/test/listeners/product_count_cubit.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:flutter_comms/flutter_comms.dart'; - -class ProductCountListenerCubit - extends ListenerCubit { - ProductCountListenerCubit() : super(0); - - @override - void onMessage(ProductCountChangedMessage message) { - if (message is ProductCountIncremented) { - _increment(); - } - if (message is ProductCountDecremented) { - _decrement(); - } - } - - @override - void onInitialMessage(ProductCountChangedMessage message) => - onMessage(message); - - void _increment() { - emit(state + 1); - } - - void _decrement() { - emit(state - 1); - } -} - -abstract class ProductCountChangedMessage {} - -class ProductCountIncremented extends ProductCountChangedMessage {} - -class ProductCountDecremented extends ProductCountChangedMessage {} diff --git a/packages/flutter_comms/test/senders/basket_cubit.dart b/packages/flutter_comms/test/senders/basket_cubit.dart deleted file mode 100644 index 0b63145..0000000 --- a/packages/flutter_comms/test/senders/basket_cubit.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'package:bloc/bloc.dart'; -import 'package:comms/comms.dart'; -import '../listeners/product_count_cubit.dart'; - -class BasketCubit extends Cubit> - with Sender { - BasketCubit() : super([]); - - void add(String product) { - emit([...state, product]); - send(ProductCountIncremented()); - } - - void removeLast() { - emit([...state]..removeLast()); - send(ProductCountDecremented()); - } -}