项目作者: hoc081098

项目描述 :
:zap: Base class, bloc provider and rxdart stream builder for BLoC pattern in flutter: https://pub.dev/packages/flutter_bloc_pattern
高级语言: Dart
项目地址: git://github.com/hoc081098/flutter_bloc_pattern.git
创建时间: 2019-02-08T09:50:17Z
项目社区:https://github.com/hoc081098/flutter_bloc_pattern

开源协议:MIT License

下载


flutter_bloc_pattern

Base class, BLoC provider and rxdart builder for BLoC pattern in Flutter.

Flutter test
Pub
Pub
codecov
GitHub
Style
Hits

Getting Started

1. Add this to your package’s pubspec.yaml file

  1. dependencies:
  2. flutter_bloc_pattern: <latest_version>

2. Implements BaseBloc

  1. import 'package:disposebag/disposebag.dart';
  2. import 'package:flutter_bloc_pattern/flutter_bloc_pattern.dart';
  3. import 'package:rxdart_ext/rxdart_ext.dart';
  4. class MyBloc implements BaseBloc {
  5. StateStream<String> get stream;
  6. @override
  7. void dispose() {}
  8. }

3. Consume BLoC

  1. final bloc = BlocProvider.of<MyBloc>(context);
  2. return RxStreamBuilder<String>(
  3. stream: bloc.stream,
  4. builder: (context, state) {
  5. return ...;
  6. },
  7. );

Example: A port of the standard “Counter Button” example from Flutter

1. File counter_bloc.dart

  1. import 'dart:async';
  2. import 'package:disposebag/disposebag.dart';
  3. import 'package:flutter_bloc_pattern/flutter_bloc_pattern.dart';
  4. import 'package:rxdart_ext/rxdart_ext.dart';
  5. class CounterBloc extends DisposeCallbackBaseBloc {
  6. /// Inputs
  7. final VoidAction increment;
  8. /// Outputs
  9. final StateStream<int> state;
  10. CounterBloc._({
  11. required VoidAction dispose,
  12. required this.increment,
  13. required this.state,
  14. }) : super(dispose);
  15. factory CounterBloc() {
  16. final incrementController = StreamController<void>();
  17. final state$ = incrementController.stream
  18. .scan<int>((acc, _, __) => acc + 1, 0)
  19. .publishState(0);
  20. return CounterBloc._(
  21. dispose: DisposeBag([incrementController, state$.connect()]).dispose,
  22. increment: incrementController.addNull,
  23. state: state$,
  24. );
  25. }
  26. }

2. File main.dart

  1. import 'package:example/bloc.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_bloc_pattern/flutter_bloc_pattern.dart';
  4. class TextCounter1 extends StatelessWidget {
  5. const TextCounter1({super.key});
  6. @override
  7. Widget build(BuildContext context) {
  8. final bloc = BlocProvider.of<CounterBloc>(context);
  9. return RxStreamBuilder<int>(
  10. stream: bloc.state,
  11. builder: (context, state) {
  12. return Text(
  13. 'COUNTER 1: $state',
  14. style: Theme.of(context).textTheme.titleLarge,
  15. );
  16. },
  17. );
  18. }
  19. }
  20. class IncrementButton extends StatelessWidget {
  21. const IncrementButton({super.key});
  22. @override
  23. Widget build(BuildContext context) {
  24. final bloc = context.bloc<CounterBloc>();
  25. return FloatingActionButton(
  26. onPressed: bloc.increment,
  27. tooltip: 'Increment',
  28. child: const Icon(Icons.add),
  29. );
  30. }
  31. }