How to use SharedPreferences with Bloc?

2.4k Views Asked by At

Here's my code:

abstract class VolumeEven{}
class VolumeUp extends VolumeEven{}
class VolumeDown extends VolumeEven{}
class VolumeMute extends VolumeEven{}

class VolumeBloc extends Bloc<VolumeEven, int> {
  late SharedPreferences prefs;

  VolumeBloc () : super (0) {
    on<VolumeUp> (_onVolumeUp);
    on<VolumeDown> (_onVolumeDown);
    on<VolumeMute> (_onVolumeMute);
  }

  Future<int> _getPref() async {
    // prefs = await SharedPreferences.getInstance();
    return await prefs.getInt('volume') ?? 0;
  }

  FutureOr<void> _onVolumeUp(VolumeUp event, Emitter<int> emit) async {
    prefs = await SharedPreferences.getInstance();
    final newVolume = (prefs.getInt('volume') ?? 0) + 5;
    emit(newVolume);
    prefs.setInt('volume', newVolume);
  }

  FutureOr<void> _onVolumeDown(VolumeDown event, Emitter<int> emit) async {
    prefs = await SharedPreferences.getInstance();
    final newVolume = (prefs.getInt('volume') ?? 0) - 5;
    emit(newVolume);
    prefs.setInt('volume', newVolume);
  }

  FutureOr<void> _onVolumeMute(VolumeMute event, Emitter<int> emit) async {
    prefs = await SharedPreferences.getInstance();
    const newVolume = 0;
    emit(newVolume);
    prefs.setInt('volume', newVolume);
  }

}

I can save 'volume' to sharedpreferences and get it when press volumeUp or volumeDown but when restart app the state become 0. It's because on Constructor it set 'super(0)'. How to get value from sharedpreferences in Constructor?

2

There are 2 best solutions below

1
On

I found my answer: emit saved value in Constructor:

 VolumeBloc () : super (0) {
    _getPref();
    on<VolumeUp> (_onVolumeUp);
    on<VolumeDown> (_onVolumeDown);
    on<VolumeMute> (_onVolumeMute);
  }
   void _getPref() async {
    prefs = await SharedPreferences.getInstance();
    emit(prefs.getInt('volume') ?? 0);
  }
0
On

You might try: Hydrated bloc

You only need to add fromJson and toJson methods.