I am trying change and update the state using radio button. State are changing successfully when I am clicking the radio button. But after hot reload or closing the app it can’t hold the state. I am using the hydrate bloc
pubspec.yaml
dependencies:
bloc: ^8.1.4
equatable: ^2.0.5
flutter:
sdk: flutter
flutter_bloc: ^8.1.5
http: ^1.2.0
hydrated_bloc: ^9.1.5
path_provider: ^2.1.3
permission_handler: ^11.3.1
Here are the code step by step
- prayer_type_bloc.dart
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:meta/meta.dart';
part 'prayer_type_event.dart';
part 'prayer_type_state.dart';
class PrayerTypeBloc extends HydratedBloc<PrayerTypeEvent, PrayerTypeState> {
PrayerTypeBloc() : super(const PrayerTypeInitial()) {
on<LocationSelected>(
(LocationSelected event, Emitter emit) =>
emit(const LocationSelectedState()),
);
on<GpsSelected>(
(GpsSelected event, Emitter emit) => emit(const GpsSelectedState()),
);
}
@override
PrayerTypeState? fromJson(Map<String, dynamic> json) {
if (json['prayer_type'] == null) {
return null;
}
switch (json['prayer_type']) {
case 'LocationSelectedState':
return const LocationSelectedState();
case 'GpsSelectedState':
return const GpsSelectedState();
default:
return null;
}
}
@override
Map<String, dynamic>? toJson(PrayerTypeState state) {
return {'prayer_type': state.toString()};
}
}
- prayer_type_event.dart
part of 'prayer_type_bloc.dart';
@immutable
sealed class PrayerTypeEvent extends Equatable {
const PrayerTypeEvent();
@override
List<Object?> get props => [];
}
class LocationSelected extends PrayerTypeEvent {
const LocationSelected();
}
class GpsSelected extends PrayerTypeEvent {
const GpsSelected();
}
- prayer_type_state.dart
part of 'prayer_type_bloc.dart';
@immutable
sealed class PrayerTypeState extends Equatable {
const PrayerTypeState();
@override
List<Object?> get props => [];
}
class PrayerTypeInitial extends PrayerTypeState {
const PrayerTypeInitial();
}
class LocationSelectedState extends PrayerTypeState {
const LocationSelectedState();
}
class GpsSelectedState extends PrayerTypeState {
const GpsSelectedState();
}
- main.dart
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:muezzyn/app_bloc_observer.dart';
import 'package:muezzyn/bloc/prayer_type/bloc/prayer_type_bloc.dart';
import 'package:muezzyn/cubit/bottom_nav_cubit.dart';
import 'package:muezzyn/widget/main_wrapper.dart';
import 'package:path_provider/path_provider.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
Bloc.observer = AppBlocObserver();
HydratedBloc.storage = await HydratedStorage.build(
storageDirectory: await getTemporaryDirectory(),
);
runApp(MainApp());
}
class MainApp extends StatelessWidget {
const MainApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: MultiBlocProvider(
providers: [
BlocProvider(create: (context) => BottomNavCubit()),
BlocProvider<PrayerTypeBloc>(create: (context) => PrayerTypeBloc()),
],
child: MainWrapper(),
),
);
}
}
Settings_Page.dart
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:muezzyn/bloc/prayer_type/bloc/prayer_type_bloc.dart';
class SettingsPage extends StatefulWidget {
const SettingsPage({super.key});
@override
State<SettingsPage> createState() => _SettingsPageState();
}
class _SettingsPageState extends State<SettingsPage> {
PrayerTypeBloc? _prayerTypeBloc;
@override
void initState() {
super.initState();
_prayerTypeBloc =
BlocProvider.of<PrayerTypeBloc>(context);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: BlocBuilder<PrayerTypeBloc, PrayerTypeState>(
bloc: _prayerTypeBloc!,
builder: (context, state) {
PrayerTypeState currentState = state;
return Center(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text("Location Preference"),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Radio<PrayerTypeState>(
value: const LocationSelectedState(),
groupValue: currentState,
onChanged: (value) {
if (value != null) {
context
.read<PrayerTypeBloc>()
.add(LocationSelected());
}
},
),
Text('Location'),
Radio<PrayerTypeState>(
value: const GpsSelectedState(),
groupValue: currentState,
onChanged: (value) {
if (value != null) {
context.read<PrayerTypeBloc>().add(GpsSelected());
}
},
),
Text('GPS'),
],
),
],
),
);
},
),
);
}
}