Problem polega na tym, że bloc mi działa, ale hydratedBloc już nie bardzo. Po restarcie apki wszystkie dane znikają.
bloc
class ShoppingListBloc
extends HydratedBloc<ShoppingListEvent, ShoppingListState> {
ShoppingListBloc() : super(ShoppingListInitial()) {
on<AddShoppingListEvent>(_addShoppingList);
}
void _addShoppingList(
AddShoppingListEvent event, Emitter<ShoppingListState> emit) async {
emit(
ShoppingListState(
shoppingLists: List.from(state.shoppingLists)..add(event.shoppingList),
),
);
}
@override
ShoppingListState? fromJson(Map<String, dynamic> json) {
return ShoppingListState.fromMap(json);
}
@override
Map<String, dynamic>? toJson(ShoppingListState state) {
return state.toMap();
}
}
state
class ShoppingListState extends Equatable {
final List<ShoppingList> shoppingLists;
const ShoppingListState({
this.shoppingLists = const <ShoppingList>[],
});
@override
List<Object> get props => [shoppingLists];
Map<String, dynamic> toMap() {
return {
'shoppingLists': shoppingLists.map((e) => e.toMap()).toList(),
};
}
factory ShoppingListState.fromMap(Map<String, dynamic> map) {
return ShoppingListState(
shoppingLists: List<ShoppingList>.from(
map['shoppingLists']?.map((x) => ShoppingList.fromMap(x)) ?? [],
),
);
}
}
final class ShoppingListInitial extends ShoppingListState {}
event
abstract class ShoppingListEvent extends Equatable {
const ShoppingListEvent();
@override
List<Object> get props => [];
}
class AddShoppingListEvent extends ShoppingListEvent {
final ShoppingList shoppingList;
const AddShoppingListEvent({required this.shoppingList});
@override
List<Object> get props => [shoppingList];
}
main.dart
void main() async {
WidgetsFlutterBinding.ensureInitialized();
HydratedBloc.storage = await HydratedStorage.build(
storageDirectory: await getApplicationDocumentsDirectory());
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
runApp(
MyApp(
appRouter: AppRouter(),
),
);
}
class MyApp extends StatelessWidget {
const MyApp({Key? key, required this.appRouter}) : super(key: key);
final AppRouter appRouter;
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MultiBlocProvider(
providers: [
BlocProvider(create: (context) => ShoppingListBloc()),
BlocProvider(create: (context) => AppStateBloc()),
],
child: MaterialApp(
theme: ThemeData.from(
colorScheme: schemeLight,
).copyWith(
textTheme: themeConfig["textTheme"],
appBarTheme: themeConfig["appBarTheme"],
),
darkTheme: ThemeData.from(
colorScheme: schemeDark,
).copyWith(
textTheme: themeConfig["textTheme"],
appBarTheme: themeConfig["appBarTheme"],
),
// home: const MainScreen(),
home: StreamBuilder(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const SplashScreen();
}
if (snapshot.hasData) {
context
.read<AppStateBloc>()
.add(SetUserId(id: snapshot.data!.uid));
GetStorage().write('uid', snapshot.data!.uid);
return const MainScreen();
}
return const AuthScreen();
},
),
onGenerateRoute: appRouter.onGenerateRoute,
),
);
}
}
Co tutaj jest źle, że state jest nadpisywany pustymi wartościami?