action_channel 0.0.1  action_channel: ^0.0.1 copied to clipboard
action_channel: ^0.0.1 copied to clipboard
Communication channel that bundles a sink and a stream, with additional logic. Allows the input/sink type to be different from the output/stream type, simplifying the entry point.
Action Channel #
Communication channel, that bundles a sink and a stream. Wrapper with convenient functionalities.
Essentially it is a wrapper that acts as a sink and a stream, with additional logic.
Features #
- Allows the input/sink type to be different from the output/stream type, simplifying the entry point.
- Handling of "replies", allowing it to be used as a request-response channel.
- Run actions when receiving certain data.
Getting Started #
dart pub add action_channel
And import the package:
import 'package:action_channel/action_channel.dart';
Usage #
Create a channel using a sink and a stream.
You may specify an action to be executed using the data returned in the .on() method.
final channel = Channel(
  sink, stream,
  action: (String data) => print('Action using "$data"')
);
Listening for data #
Listen to the channel with .on(), this will enable you to run an action with the returning data, like a "reply".
final subscription = channel.on((data) {
  print('Data received "$data"');
  return 'New action using "$data"';
});
subscription.cancel();
You can also use .once() to listen to the channel only once.
Note: The channel can be used just like a stream, with
.listen().
Channel Controller #
Create a channel using ChannelController, creating a channel that handles the sink and stream, by itself.
Abstracting the sink and stream creation.
A controller needs a function that transforms the input/sink data type into the output/stream data type.
It's recommended to use the Channel.controller() factory, which automatically creates a ChannelController.
final channel = Channel<int, String, void>.controller(
  (int id) => User(id),
);
In addition, it offers callbacks and the ability to append and prepend them.
final channel = Channel<int, String, void>.controller(
  (int id) => User(id),
  
  onAdded: (int id) => print('User $id added'),
  onData: (User user) => print('User with id "${ user.id }" received'),
  onListen: (subscription) => print('Channel listened'),
  onClose: () => print('Channel closed'),
);
Example #
User Channel (/example/main.dart)
import 'package:action_channel/action_channel.dart'; 
final users = <User>{
  User(1, 'John'),
  User(2, 'Tom', muted: true),
  User(3, 'Alex'),
};
void main() {
  final channel = Channel<int, User, String>.controller(
    (id) => users.firstWhere((user) => user.id == id),
    action: (message, user, channel) => user.say(message),
  );
  channel.where((user) => !user.muted).on((user) => 'Hello!');
  channel.once((data) {
    print('First user: ${ data.name }');
    return null;
  });
  channel.add(1);
  channel.add(2);
  channel.add(3);
}
/* -= Models =- */
class User {
  final int id;
  final String name;
  final bool muted;
  User(this.id, this.name, { this.muted = false });
  void say(String message) => print('User $id says "$message"');
}
Contributing #
Contributions are welcome! Please open an issue or pull request if you find a bug or have a feature request.