flutter_bloc

v8.1.6

Flutter Widgets that make it easy to implement the BLoC (Business Logic Component) design pattern. Built to be used with the bloc state management package.

Архив пакета: https://pubdev.letsnova.ru/api/archives/flutter_bloc/8.1.6.tar.gz

Установкаdart pub add flutter_bloc

README

build

Flutter Bloc Package

Pub build codecov Star on Github Flutter Website Awesome Flutter Flutter Samples License: MIT Discord Bloc Library


Widgets that make it easy to integrate blocs and cubits into Flutter. Built to work with package:bloc.

Learn more at bloclibrary.dev!

*Note: All widgets exported by the flutter_bloc package integrate with both Cubit and Bloc instances.


Sponsors

Our top sponsors are shown below! [Become a Sponsor]


Usage

Lets take a look at how to use BlocProvider to provide a CounterCubit to a CounterPage and react to state changes with BlocBuilder.

counter_cubit.dart

class CounterCubit extends Cubit<int> {
                  CounterCubit() : super(0);
                
                  void increment() => emit(state + 1);
                  void decrement() => emit(state - 1);
                }
                

main.dart

void main() => runApp(CounterApp());
                
                class CounterApp extends StatelessWidget {
                  @override
                  Widget build(BuildContext context) {
                    return MaterialApp(
                      home: BlocProvider(
                        create: (_) => CounterCubit(),
                        child: CounterPage(),
                      ),
                    );
                  }
                }
                

counter_page.dart

class CounterPage extends StatelessWidget {
                  @override
                  Widget build(BuildContext context) {
                    return Scaffold(
                      appBar: AppBar(title: const Text('Counter')),
                      body: BlocBuilder<CounterCubit, int>(
                        builder: (context, count) => Center(child: Text('$count')),
                      ),
                      floatingActionButton: Column(
                        crossAxisAlignment: CrossAxisAlignment.end,
                        mainAxisAlignment: MainAxisAlignment.end,
                        children: <Widget>[
                          FloatingActionButton(
                            child: const Icon(Icons.add),
                            onPressed: () => context.read<CounterCubit>().increment(),
                          ),
                          const SizedBox(height: 4),
                          FloatingActionButton(
                            child: const Icon(Icons.remove),
                            onPressed: () => context.read<CounterCubit>().decrement(),
                          ),
                        ],
                      ),
                    );
                  }
                }
                

At this point we have successfully separated our presentational layer from our business logic layer. Notice that the CounterPage widget knows nothing about what happens when a user taps the buttons. The widget simply notifies the CounterCubit that the user has pressed either the increment or decrement button.

Bloc Widgets

BlocBuilder

BlocBuilder is a Flutter widget which requires a bloc and a builder function. BlocBuilder handles building the widget in response to new states. BlocBuilder is very similar to StreamBuilder but has a more simple API to reduce the amount of boilerplate code needed. The builder function will potentially be called many times and should be a pure function that returns a widget in response to the state.

See BlocListener if you want to "do" anything in response to state changes such as navigation, showing a dialog, etc...

If the bloc parameter is omitted, BlocBuilder will automatically perform a lookup using BlocProvider and the current BuildContext.

BlocBuilder<BlocA, BlocAState>(
                  builder: (context, state) {
                    // return widget here based on BlocA's state
                  }
                )
                

Only specify the bloc if you wish to provide a bloc that will be scoped to a single widget and isn't accessible via a parent BlocProvider and the current BuildContext.

BlocBuilder<BlocA, BlocAState>(
                  bloc: blocA, // provide the local bloc instance
                  builder: (context, state) {
                    // return widget here based on BlocA's state
                  }
                )
                

For fine-grained control over when the builder function is called an optional buildWhen can be provided. buildWhen takes the previous bloc state and current bloc state and returns a boolean. If buildWhen returns true, builder will be called with state and the widget will rebuild. If buildWhen returns false, builder will not be called with state and no rebuild will occur.

BlocBuilder<BlocA, BlocAState>(
                  buildWhen: (previousState, state) {
                    // return true/false to determine whether or not
                    // to rebuild the widget with state
                  },
                  builder: (context, state) {
                    // return widget here based on BlocA's state
                  }
                )
                

BlocSelector

BlocSelector is a Flutter widget which is analogous to BlocBuilder but allows developers to filter updates by selecting a new value based on the current bloc state. Unnecessary builds are prevented if the selected value does not change. The selected value must be immutable in order for BlocSelector to accurately determine whether builder should be called again.

If the bloc parameter is omitted, BlocSelector will automatically perform a lookup using BlocProvider and the current BuildContext.

BlocSelector<BlocA, BlocAState, SelectedState>(
                  selector: (state) {
                    // return selected state based on the provided state.
                  },
                  builder: (context, state) {
                    // return widget here based on the selected state.
                  },
                )
                

BlocProvider

BlocProvider is a Flutter widget which provides a bloc to its children via BlocProvider.of<T>(context). It is used as a dependency injection (DI) widget so that a single instance of a bloc can be provided to multiple widgets within a subtree.

In most cases, BlocProvider should be used to create new blocs which will be made available to the rest of the subtree. In this case, since BlocProvider is responsible for creating the bloc, it will automatically handle closing it.

BlocProvider(
                  create: (BuildContext context) => BlocA(),
                  child: ChildA(),
                );
                

By default, BlocProvider will create the bloc lazily, meaning create will get executed when the bloc is looked up via BlocProvider.of<BlocA>(context).

To override this behavior and force create to be run immediately, lazy can be set to false.

BlocProvider(
                  lazy: false,
                  create: (BuildContext context) => BlocA(),
                  child: ChildA(),
                );
                

In some cases, BlocProvider can be used to provide an existing bloc to a new portion of the widget tree. This will be most commonly used when an existing bloc needs to be made available to a new route. In this case, BlocProvider will not automatically close the bloc since it did not create it.

BlocProvider.value(
                  value: BlocProvider.of<BlocA>(context),
                  child: ScreenA(),
                );
                

then from either ChildA, or ScreenA we can retrieve BlocA with:

// with extensions
                context.read<BlocA>();
                
                // without extensions
                BlocProvider.of<BlocA>(context);
                

The above snippets result in a one time lookup and the widget will not be notified of changes. To retrieve the instance and subscribe to subsequent state changes use:

// with extensions
                context.watch<BlocA>();
                
                // without extensions
                BlocProvider.of<BlocA>(context, listen: true);
                

In addition, context.select can be used to retrieve part of a state and react to changes only when the selected part changes.

final isPositive = context.select((CounterBloc b) => b.state >= 0);
                

The snippet above will only rebuild if the state of the CounterBloc changes from positive to negative or vice versa and is functionally identical to using a BlocSelector.

MultiBlocProvider

MultiBlocProvider is a Flutter widget that merges multiple BlocProvider widgets into one. MultiBlocProvider improves the readability and eliminates the need to nest multiple BlocProviders. By using MultiBlocProvider we can go from:

BlocProvider<BlocA>(
                  create: (BuildContext context) => BlocA(),
                  child: BlocProvider<BlocB>(
                    create: (BuildContext context) => BlocB(),
                    child: BlocProvider<BlocC>(
                      create: (BuildContext context) => BlocC(),
                      child: ChildA(),
                    )
                  )
                )
                

to:

MultiBlocProvider(
                  providers: [
                    BlocProvider<BlocA>(
                      create: (BuildContext context) => BlocA(),
                    ),
                    BlocProvider<BlocB>(
                      create: (BuildContext context) => BlocB(),
                    ),
                    BlocProvider<BlocC>(
                      create: (BuildContext context) => BlocC(),
                    ),
                  ],
                  child: ChildA(),
                )
                

BlocListener

BlocListener is a Flutter widget which takes a BlocWidgetListener and an optional bloc and invokes the listener in response to state changes in the bloc. It should be used for functionality that needs to occur once per state change such as navigation, showing a SnackBar, showing a Dialog, etc...

listener is only called once for each state change (NOT including the initial state) unlike builder in BlocBuilder and is a void function.

If the bloc parameter is omitted, BlocListener will automatically perform a lookup using BlocProvider and the current BuildContext.

BlocListener<BlocA, BlocAState>(
                  listener: (context, state) {
                    // do stuff here based on BlocA's state
                  },
                  child: Container(),
                )
                

Only specify the bloc if you wish to provide a bloc that is otherwise not accessible via BlocProvider and the current BuildContext.

BlocListener<BlocA, BlocAState>(
                  bloc: blocA,
                  listener: (context, state) {
                    // do stuff here based on BlocA's state
                  }
                )
                

For fine-grained control over when the listener function is called an optional listenWhen can be provided. listenWhen takes the previous bloc state and current bloc state and returns a boolean. If listenWhen returns true, listener will be called with state. If listenWhen returns false, listener will not be called with state.

BlocListener<BlocA, BlocAState>(
                  listenWhen: (previousState, state) {
                    // return true/false to determine whether or not
                    // to call listener with state
                  },
                  listener: (context, state) {
                    // do stuff here based on BlocA's state
                  },
                  child: Container(),
                )
                

MultiBlocListener

MultiBlocListener is a Flutter widget that merges multiple BlocListener widgets into one. MultiBlocListener improves the readability and eliminates the need to nest multiple BlocListeners. By using MultiBlocListener we can go from:

BlocListener<BlocA, BlocAState>(
                  listener: (context, state) {},
                  child: BlocListener<BlocB, BlocBState>(
                    listener: (context, state) {},
                    child: BlocListener<BlocC, BlocCState>(
                      listener: (context, state) {},
                      child: ChildA(),
                    ),
                  ),
                )
                

to:

MultiBlocListener(
                  listeners: [
                    BlocListener<BlocA, BlocAState>(
                      listener: (context, state) {},
                    ),
                    BlocListener<BlocB, BlocBState>(
                      listener: (context, state) {},
                    ),
                    BlocListener<BlocC, BlocCState>(
                      listener: (context, state) {},
                    ),
                  ],
                  child: ChildA(),
                )
                

BlocConsumer

BlocConsumer exposes a builder and listener in order react to new states. BlocConsumer is analogous to a nested BlocListener and BlocBuilder but reduces the amount of boilerplate needed. BlocConsumer should only be used when it is necessary to both rebuild UI and execute other reactions to state changes in the bloc. BlocConsumer takes a required BlocWidgetBuilder and BlocWidgetListener and an optional bloc, BlocBuilderCondition, and BlocListenerCondition.

If the bloc parameter is omitted, BlocConsumer will automatically perform a lookup using BlocProvider and the current BuildContext.

BlocConsumer<BlocA, BlocAState>(
                  listener: (context, state) {
                    // do stuff here based on BlocA's state
                  },
                  builder: (context, state) {
                    // return widget here based on BlocA's state
                  }
                )
                

An optional listenWhen and buildWhen can be implemented for more granular control over when listener and builder are called. The listenWhen and buildWhen will be invoked on each bloc state change. They each take the previous state and current state and must return a bool which determines whether or not the builder and/or listener function will be invoked. The previous state will be initialized to the state of the bloc when the BlocConsumer is initialized. listenWhen and buildWhen are optional and if they aren't implemented, they will default to true.

BlocConsumer<BlocA, BlocAState>(
                  listenWhen: (previous, current) {
                    // return true/false to determine whether or not
                    // to invoke listener with state
                  },
                  listener: (context, state) {
                    // do stuff here based on BlocA's state
                  },
                  buildWhen: (previous, current) {
                    // return true/false to determine whether or not
                    // to rebuild the widget with state
                  },
                  builder: (context, state) {
                    // return widget here based on BlocA's state
                  }
                )
                

RepositoryProvider

RepositoryProvider is a Flutter widget which provides a repository to its children via RepositoryProvider.of<T>(context). It is used as a dependency injection (DI) widget so that a single instance of a repository can be provided to multiple widgets within a subtree. BlocProvider should be used to provide blocs whereas RepositoryProvider should only be used for repositories.

RepositoryProvider(
                  create: (context) => RepositoryA(),
                  child: ChildA(),
                );
                

then from ChildA we can retrieve the Repository instance with:

// with extensions
                context.read<RepositoryA>();
                
                // without extensions
                RepositoryProvider.of<RepositoryA>(context)
                

MultiRepositoryProvider

MultiRepositoryProvider is a Flutter widget that merges multiple RepositoryProvider widgets into one. MultiRepositoryProvider improves the readability and eliminates the need to nest multiple RepositoryProvider. By using MultiRepositoryProvider we can go from:

RepositoryProvider<RepositoryA>(
                  create: (context) => RepositoryA(),
                  child: RepositoryProvider<RepositoryB>(
                    create: (context) => RepositoryB(),
                    child: RepositoryProvider<RepositoryC>(
                      create: (context) => RepositoryC(),
                      child: ChildA(),
                    )
                  )
                )
                

to:

MultiRepositoryProvider(
                  providers: [
                    RepositoryProvider<RepositoryA>(
                      create: (context) => RepositoryA(),
                    ),
                    RepositoryProvider<RepositoryB>(
                      create: (context) => RepositoryB(),
                    ),
                    RepositoryProvider<RepositoryC>(
                      create: (context) => RepositoryC(),
                    ),
                  ],
                  child: ChildA(),
                )
                

Gallery

Examples

  • Counter - an example of how to create a CounterBloc to implement the classic Flutter Counter app.
  • Form Validation - an example of how to use the bloc and flutter_bloc packages to implement form validation.
  • Bloc with Stream - an example of how to hook up a bloc to a Stream and update the UI in response to data from the Stream.
  • Complex List - an example of how to manage a list of items and asynchronously delete items one at a time using bloc and flutter_bloc.
  • Infinite List - an example of how to use the bloc and flutter_bloc packages to implement an infinite scrolling list.
  • Login Flow - an example of how to use the bloc and flutter_bloc packages to implement a Login Flow.
  • Firebase Login - an example of how to use the bloc and flutter_bloc packages to implement login via Firebase.
  • Github Search - an example of how to create a Github Search Application using the bloc and flutter_bloc packages.
  • Weather - an example of how to create a Weather Application using the bloc and flutter_bloc packages. The app uses a RefreshIndicator to implement "pull-to-refresh" as well as dynamic theming.
  • Todos - an example of how to create a Todos Application using the bloc and flutter_bloc packages.
  • Timer - an example of how to create a Timer using the bloc and flutter_bloc packages.
  • Shopping Cart - an example of how to create a Shopping Cart Application using the bloc and flutter_bloc packages based on flutter samples.
  • Dynamic Form - an example of how to use the bloc and flutter_bloc packages to implement a dynamic form which pulls data from a repository.
  • Wizard - an example of how to build a multi-step wizard using the bloc and flutter_bloc packages.
  • Fluttersaurus - an example of how to use the bloc and flutter_bloc packages to create a thesuarus app -- made for Bytconf Flutter 2020.
  • I/O Photo Booth - an example of how to use the bloc and flutter_bloc packages to create a virtual photo booth web app -- made for Google I/O 2021.
  • I/O Pinball - an example of how to use the bloc and flutter_bloc packages to create a pinball web app -- made for Google I/O 2022.

Dart Versions

  • Dart 2: >= 2.12

Maintainers

История изменений

8.1.6

  • docs: fix gallery image urls (#4184)

8.1.5

  • feat: override debugFillProperties (#4082)
  • docs: add missing comma to BlocListener API docs (#4106)
  • chore: update copyright year
  • chore: update sponsors

8.1.4

  • chore: update sponsors (#4054)
  • chore: adjust example themes
  • chore: fix require_trailing_commas (#3977)
  • chore: add topics to pubspec.yaml (#3914)

8.1.3

  • docs: remove graphql sample references from README (#3820)
  • docs: upgrade to Dart 3 (#3809)
  • refactor: standardize analysis_options (#3809)
  • refactor: update sdk constraints and fix analysis warnings (#3809)

8.1.2

  • chore: add screenshots to pubspec.yaml (#3717)
  • chore(deps): upgrade to bloc ^8.1.1 (#3716)
  • chore: update example to Dart 2.19 (#3715)
  • refactor: BlocObserver instances to use const constructors (#3713)
  • refactor: remove unnecessary single child widget mixins (#3675)
  • refactor: upgrade to Flutter 3.7 (#3699)
    • remove deprecated invariant_booleans lint rule

8.1.1

  • chore: remove dependency overrides from example to fix pana score

8.1.0

  • feat: upgrade to bloc: ^8.1.0
  • chore: upgrade example to latest bloc and hydrated_bloc (#3481)
  • docs: update GetStream utm tags (#3136)
  • docs: update VGV sponsors logo (#3125)

8.0.1

  • refactor: use core interfaces from bloc v8.0.2 (#3012)
  • docs: update example to follow naming conventions (#3027)

8.0.0

  • BREAKING: feat: upgrade to bloc v8.0.0

8.0.0-dev.3

  • BREAKING: feat: upgrade to bloc v8.0.0-dev.5

8.0.0-dev.2

  • BREAKING: feat: upgrade to bloc v8.0.0-dev.3

8.0.0-dev.1

  • BREAKING: feat: upgrade to bloc v8.0.0-dev.2

7.3.3

  • fix: add missing child assertion to BlocListener and BlocProvider (#2924)

7.3.2

  • fix: BlocProvider explicitly default lazy to true to support avoid_redundant_argument_values (#2917)

7.3.1

  • fix: determine bloc reference changes via identical
    • Previously identityHashCode was used to determine if the bloc reference had changed to trigger a rebuild (#2482) however, it's possible for different bloc references to have the same hashCode as a result of hash collisions. The fix uses identical to determine whether the bloc reference has changed.
  • docs: add inline docs to library
  • docs: minor improvements to example and README
  • chore: remove unneeded imports

7.3.0

  • feat: upgrade to bloc: ^7.2.0

7.2.0

  • feat: upgrade to provider: ^6.0.0

7.1.0

  • feat: add BlocSelector widget

7.0.1

  • fix: BlocConsumer, BlocBuilder, and BlocListener depend on bloc/cubit instance
    • when a provided bloc instance changes, BlocConsumer, BlocBuilder, and BlocListener will all update to use the new instance
  • docs: update BlocBuilder and BlocListener inline API docs to include buildWhen and listenWhen

7.0.0

  • BREAKING: refactor: rename cubit parameter to bloc
    • refactor: rename cubit parameter in BlocListener to bloc
    • refactor: rename cubit parameter in BlocBuilder to bloc
    • refactor: rename cubit parameter in BlocConsumer to bloc
  • BREAKING: opt into null safety
    • upgrade Dart SDK constraints to >=2.12.0-0 <3.0.0
  • BREAKING: refactor: remove deprecated context.repository
  • feat: upgrade to bloc: ^7.0.0
  • feat: upgrade to provider: ^5.0.0

7.0.0-nullsafety.6

  • chore: bump to bloc: ^7.0.0-nullsafety.4

7.0.0-nullsafety.5

  • BREAKING: refactor: remove deprecated context.repository

7.0.0-nullsafety.4

  • chore: bump to provider: ^5.0.0

7.0.0-nullsafety.3

  • chore: bump to bloc: ^7.0.0-nullsafety.3
  • chore: bump to provider: ^5.0.0-nullsafety.5

7.0.0-nullsafety.2

  • chore: bump to bloc: ^7.0.0-nullsafety.2

7.0.0-nullsafety.1

  • BREAKING: refactor: upgrade to bloc ^7.0.0-nullsafety.1
    • refactor: rename cubit parameter in BlocListener to bloc
    • refactor: rename cubit parameter in BlocBuilder to bloc
    • refactor: rename cubit parameter in BlocConsumer to bloc
  • feat: upgrade to provider ^5.0.0-nullsafety.3

7.0.0-nullsafety.0

  • BREAKING: opt into null safety
  • feat!: upgrade Dart SDK constraints to >=2.12.0-0 <3.0.0

7.0.0-dev.2

  • BREAKING: revert 7.0.0-dev.1
  • BREAKING: remove context.bloc extension
  • BREAKING: rename cubit parameter in BlocListener to value
  • BREAKING: rename cubit parameter in BlocBuilder to value
  • BREAKING: rename cubit parameter in BlocConsumer to value
  • docs: update inline API docs

7.0.0-dev.1

  • BREAKING: remove dependency on package:provider
  • feat: add optional listen to BlocProvider
  • feat: add ListenProviderExtension
  • docs: improve inline documentation for BlocProvider and RepositoryProvider

6.1.3

  • feat: expose ProviderNotFoundException
  • chore: upgrade to bloc ^6.1.3
  • chore: upgrade to provider ^4.3.3

6.1.2

  • fix: BlocProvider.value use InheritedProvider.value

6.1.1

  • fix: BlocConsumer does not respect buildWhen and results in unnecessary rebuilds

6.1.0

  • feat: add optional listen to BlocProvider and RepositoryProvider
  • feat: add context.select<T, R>(R Function(T value)) which allows widgets to listen to only a small part of the state of T (R)
  • feat: add context.watch<T>() which allows widgets to listen to changes in the state of T
  • feat: add context.read<T>() which allows widgets to access T without listening for changes
  • deprecated: context.bloc in favor of context.read and context.watch
  • deprecated: context.repository in favor of context.read and context.watch
  • fix: rethrow ProviderNotFoundException from RepositoryProvider for external dependencies
  • docs: improve inline documentation for BlocProvider and RepositoryProvider
  • docs: update list of examples in README

6.0.6

  • docs: improve inline documentation for buildWhen

6.0.5

  • fix: BlocBuilder builder and buildWhen state mismatch

6.0.4

  • fix: state synchronization issue when providing a condition

6.0.3

  • refactor: BlocConsumer requires a single subscription
  • refactor: BlocBuilder extends BlocListener
  • refactor: MultiRepositoryProvider extends MultiProvider

6.0.2

  • docs: fix missing API documentation generated by dartdoc

6.0.1

  • docs: minor documentation fixes and improvements

6.0.0

  • BREAKING: upgrade to bloc ^6.0.0
  • BREAKING: BlocBuilder interop with cubit (bloc parameter renamed to cubit)
  • BREAKING: BlocListener interop with cubit (bloc parameter renamed to cubit)
  • BREAKING: BlocConsumer interop with cubit (bloc parameter renamed to cubit)
  • feat: remove external dependency on package:flutter_cubit
  • docs: inline documentation updates
  • docs: README updates
  • docs: example application updates

6.0.0-dev.1

  • BREAKING: upgrade to bloc ^6.0.0-dev.1
  • BREAKING: BlocBuilder interop with cubit (bloc parameter renamed to cubit)
  • BREAKING: BlocListener interop with cubit (bloc parameter renamed to cubit)
  • BREAKING: BlocConsumer interop with cubit (bloc parameter renamed to cubit)
  • feat: remove external dependency on package:flutter_cubit
  • docs: inline documentation updates
  • docs: README updates
  • docs: example application updates

5.0.1

  • fix: upgrade to bloc ^5.0.1
  • docs: minor documentation updates

5.0.0

  • BREAKING: condition on BlocBuilder renamed to buildWhen
  • BREAKING: condition on BlocListener renamed to listenWhen
  • BREAKING: upgrade to bloc v5.0.0
  • refactor: internal implementation updates to use flutter_cubit
  • docs: various improvements
  • docs: logo updates

5.0.0-dev.5

  • Update to bloc: ^5.0.0-dev.11
  • Minor README updates

5.0.0-dev.4

  • Update to bloc: ^5.0.0-dev.10
  • Minor README updates

5.0.0-dev.3

  • Update to bloc: ^5.0.0-dev.7

5.0.0-dev.2

  • Update to bloc: ^5.0.0-dev.6
  • Update to flutter_cubit ^0.0.12
  • Various Documentation Updates

5.0.0-dev.1

  • Update to bloc: ^5.0.0-dev.3
  • Internal implementation updates to use flutter_cubit

4.0.1

  • Fix ProviderNotFoundException handling (#1286)

4.0.0

  • Update to bloc: ^4.0.0
  • Update to provider: ^4.0.5

4.0.0-dev.4

  • Update to bloc: ^4.0.0-dev.4

4.0.0-dev.3

  • Update to bloc: ^4.0.0-dev.3

4.0.0-dev.2

  • Update to bloc: ^4.0.0-dev.2

4.0.0-dev.1

  • Update to bloc: ^4.0.0-dev.1

3.2.0

  • Fix type inference for: MultiBlocProvider, MultiRepositoryProvider, MultiBlocListener (#773)
  • Fix swallowed exceptions within BlocProvider and RepositoryProvider (#807)
  • Add BlocProviderExtension and RepositoryProviderExtension on BuildContext (#608)

3.1.0

  • Expose lazy parameter on RepositoryProvider and BlocProvider (#749)
  • Updated to provider: ^4.0.1 (#748)
  • Add BlocConsumer (#545)
  • Export bloc as part of flutter_bloc

3.0.0

  • Updated to bloc: ^3.0.0 (#700)
  • Updated to flutter >=1.12.1 (#700)
  • Updated to provider: ^4.0.0 (#700, #734)
  • Revert BlocBuilder and BlocListener condition behavior to set previousState to the previous bloc state (#709)

3.0.0-dev.1

  • Updated to bloc: ^3.0.0-dev.1

2.1.1

  • Fix internal analysis warnings
  • Enforce provider ^3.2.0

2.1.0

  • Deprecate builder in BlocProvider in favor of create to align with provider.
  • Deprecate builder in RepositoryProvider in favor of create to align with provider.

2.0.1

  • Fix BlocBuilder and BlocListener condition behavior to set previousState to the previous state used by BlocBuilder/BlocListener instead of the previous state of the bloc.
  • Minor Documentation Updates

2.0.0

1.0.0

Updated to bloc: ^1.0.0 and Documentation Updates

0.22.1

Minor Bugfixes and Documentation Updates

0.22.0

Updated to bloc: ^0.16.0 and Documentation Updates

0.21.0

Updated to bloc: ^0.15.0 and Documentation Updates

0.20.1

  • Minor Updates to Package Dependencies
  • Documentation Updates

0.20.0

  • Add Automatic Bloc Lookup to BlocBuilder and BlocListener (#415)
  • Support for BlocProvider instantiation and look-up within the same BuildContext (#415)
  • Documentation Updates

0.19.1

Add optional condition to BlocListener to control listener calls (#406) and Documentation Updates

0.19.0

Addresses #354

BlocProvider

  • Refactor BlocProvider to extend Provider
  • Rename BlocProviderTree to MultiBlocProvider

ImmutableProvider

  • Refactor ImmutableProvider to extend Provider
  • Rename ImmutableProvider to RepositoryProvider
  • Rename ImmutableProviderTree to MultiRepositoryProvider

BlocListener

  • Rename BlocListenerTree to MultiBlocListener

Documentation

  • Inline documentation updates/improvements

0.18.3

Fix BlocProvider bug where copyWith does not preserve dispose value (#376).

0.18.2

Fix BlocListener bug where listener gets called even when no state change occurs (#368).

0.18.1

Minor Documentation Updates

0.18.0

Expose ImmutableProvider & ImmutableProviderTree to enable developers to provide immutable values, such as repositories, throughout the widget tree (#364) and Documentation Updates

0.17.0

Update BlocProvider to automatically dispose the provided bloc (#349) and Documentation Updates

0.16.0

Update BlocProvider to expose builder and dispose (#344 and #347) and Documentation Updates

0.15.1

Fix null initial previousState in BlocBuilder condition (#328) and Documentation Updates

0.15.0

Added optional condition to BlocBuilder to control widget rebuilds (#315) and Documentation Updates

0.14.0

Updated to bloc: ^0.14.0 and Documentation Updates

0.13.0

Updated to bloc: ^0.13.0 and Documentation Updates

0.12.0

Added BlocListenerTree and Documentation Updates

0.11.1

Broaden Dart version range and Minor Documentation Updates

0.11.0

Updated to bloc: ^0.12.0 and Documentation Updates

0.10.1

Invoke BlocWidgetListener on initial state and Documentation Updates

0.10.0

Added BlocListener and Documentation Updates

0.9.1

Minor Updates to Documentation.

0.9.0

Updated to bloc: ^0.11.0 and Documentation Updates

0.8.0

Updated to bloc: ^0.10.0 and Documentation Updates

0.7.1

Minor Updates to Documentation.

0.7.0

Added BlocProviderTree and Documentation Updates

0.6.3

Updated to bloc:^0.9.3 and Minor Updates to Documentation

0.6.2

Additional Minor Updates to Documentation

0.6.1

Minor Updates to Documentation

0.6.0

Updated to bloc: ^0.9.0

0.5.4

Additional Minor Updates to Documentation

0.5.3

Additional Minor Updates to Documentation

0.5.2

Minor Updates to Documentation

0.5.1

BlocProvider performance improvements

0.5.0

Updated to bloc: ^0.8.0

0.4.12

Additional Minor Updates to Documentation

0.4.11

Additional Minor Updates to Documentation

0.4.10

Additional BlocBuilder enhancements

  • BlocBuilder no longer filters out States giving developers full control

Minor Updates to Documentation and Examples

0.4.9

Additional BlocBuilder enhancements

  • BlocBuilder no longer has a dependency on RxDart
  • Using bloc: ">=0.7.5 <0.8.0"

0.4.8

Additional BlocProvider performance improvements

0.4.7

Minor Updates to Documentation and Examples

0.4.6

Bug Fixes

  • Fixed bug where BlocBuilder would return initial state instead of the latest state

0.4.5

Additional Minor Updates to Documentation

0.4.4

Minor updates to documentation and improved error reporting in BlocProvider

0.4.3

BlocBuilder performance improvements

0.4.2

BlocProvider performance improvements

0.4.1

Minor Updates to Documentation

0.4.0

Updated to bloc: ^0.7.0

0.3.1

Minor Updates to Documentation

0.3.0

Updated to bloc: ^0.6.0

0.2.1

Minor Updates to Documentation

0.2.0

Updates to BlocBuilder and BlocProvider

  • BlocBuilder does not automatically dispose a Bloc. Developers are now responsible for determining when to call Bloc.dispose()
  • BlocProvider support for of(context) with generics
    • Support for multiple nested BlocProviders with different Bloc Types.

0.1.1

Minor Updates to Documentation

0.1.0

Initial Version of the library.

  • Includes the ability to connect presentation layer to Bloc by using the BlocBuilder Widget.
  • Includes BlocProvider, a DI widget that allows a single instance of a bloc to be provided to multiple widgets within a subtree.