value_cubit 1.3.3 copy "value_cubit: ^1.3.3" to clipboard
value_cubit: ^1.3.3 copied to clipboard

A dart package that helps implements basic states for BLoC library

A dart package that helps to implement basic states for BLoC library to perform, load and fetch data.

pub package Test codecov License: MIT

Features #

  • Provides all necessary states for data : init, waiting, value/no value and error states (from value_state),
  • A ValueCubit class to simplify Cubit subclassing,
  • A RefreshValueCubit class like ValueCubit with refreshing capabilities,
  • Some helpers perform (an extension on Cubit) to emit intermediate states while an action is intended to update state : the same state is reemitted with attribute refreshing at true.

Usage #

This example shows how different value states from this library help developpers to show load step data widgets.

class CounterCubit extends ValueCubit<int> {
  var _value = 0;

  // Put your WS call that can be refreshed
  Future<int> _getCounterValueFromWebService() async => _value++;

  Future<void> increment() => perform(() async {
        // [perform] generate intermediate or final states such as PendingState,
        // concrete subclass of ReadyState with right [ReadyState.refreshing] value
        // or ErrorState if an error is raised.
        final result = await _getCounterValueFromWebService();

        emit(ValueState(result));
      });

  void clear() {
    _value = 0;
    emit(const PendingState());
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({super.key});

  @override
  Widget build(BuildContext context) {
    final theme = Theme.of(context);

    return BlocBuilder<CounterCubit, BaseState<int>>(builder: (context, state) {
      return Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Demo Home Page'),
        ),
        body: DefaultTextStyle(
          style: const TextStyle(fontSize: 24),
          textAlign: TextAlign.center,
          child: state is ReadyState<int>
              ? Column(
                  crossAxisAlignment: CrossAxisAlignment.stretch,
                  children: <Widget>[
                    if (state.refreshing) const LinearProgressIndicator(),
                    const Spacer(),
                    if (state.hasError)
                      Text('Expected error.',
                          style: TextStyle(color: theme.colorScheme.error)),
                    if (state is WithValueState<int>) ...[
                      if (state.hasError)
                        const Text('Previous counter value :')
                      else
                        const Text('Actual counter value :'),
                      Text(
                        state.value.toString(),
                        style: theme.textTheme.headlineMedium,
                      ),
                    ],
                    if (state is NoValueState<int>) const Text('No Value'),
                    const Spacer(),
                  ],
                )
              : const Center(child: CircularProgressIndicator()),
        ),
        floatingActionButton: state is! ReadyState<int>
            ? null
            : FloatingActionButton(
                onPressed: state.refreshing
                    ? null
                    : context.read<CounterCubit>().increment,
                tooltip: 'Increment',
                child: state.refreshing
                    ? SizedBox.square(
                        dimension: 20,
                        child: CircularProgressIndicator(
                            color: theme.colorScheme.onPrimary))
                    : const Icon(Icons.refresh)),
      );
    });
  }
}

The whole code of this example is available in example.

If your cubit is only a getter with the need to refresh your cubit state, you can simplify the implementation ValueCubit with RefreshValueCubit.

class CounterCubit extends RefreshValueCubit<int> {
  var _value = 0;

  // Put your WS call that can be refreshed
  Future<int> _getCounterValueFromWebService() async => _value++;

  @override
  Future<void> emitValues() async {
    final result = await _getCounterValueFromWebService();

    emit(ValueState(result));
  }
}

Update your value (increment in our example) by calling myCubit.refresh().

Feedback #

Please file any issues, bugs or feature requests as an issue on the Github page.

4
likes
140
pub points
70%
popularity

Publisher

verified publisherdevobs.dev

A dart package that helps implements basic states for BLoC library

Homepage
Repository (GitHub)
View/report issues

Documentation

API reference

License

MIT (LICENSE)

Dependencies

bloc, meta, stream_transform, synchronized, value_state

More

Packages that depend on value_cubit