[英]Flutter Hydrated Bloc always replaced with the initial state and not persisting
[英]Persisting State using Hydrated Bloc version 5 and above
我正在嘗試使用 Hydrated Bloc 在我的應用程序中保留狀態。 我發現的教程都使用以前版本的BlocSupervisor
並使用BlocSupervisor
,它在 v.5 ( https://pub.dev/packages/bloc/changelog ) 的bloc
包的 Dart 版本中被刪除。 flutter_bloc
和hydrated_bloc
刪除它,當他們更新到bloc
V.5( https://pub.dev/packages/flutter_bloc/changelog和https://pub.dev/packages/hydrated_bloc/changelog )。 文檔說它應該替換為BlocObserver
。 hydrated_bloc
和flutter_bloc
沒有列出的替代品。 到目前為止,我還沒有找到一個HydratedBloc教程,比其他用途的任何BlocSupervisor
和BlocDelegate
; 只有flutter_bloc
教程。
如何創建與BlocObserver
等效的BlocObserver
以保持狀態?
由於您沒有提供任何代碼,因此這里有一個保存基本String
的示例。
State
abstract class TestState extends Equatable {
final String testString;
const TestState(this.testString);
@override
List<Object> get props => [testString];
}
class State1 extends TestState {
State1({required String testString}) : super(testString);
}
Events
abstract class TestEvent {}
class ChangeStringToSaved extends TestEvent {}
class UpdateSaved extends TestEvent {}
HydradedBloc
class TestBloc extends HydratedBloc<TestEvent, TestState> {
TestBloc() : super(State1(testString: 'not saved')) {
on<ChangeStringToSaved>(
(event, emit) => emit(State1(testString: 'this is saved')));
on<UpdateSaved>(
(event, emit) => emit(State1(testString: 'updated saved value')));
}
// Creating State1 from stored Map
@override
TestState? fromJson(Map<String, dynamic> json) {
return State1(testString: json['value'] as String);
}
// Saving to a basic Map
@override
Map<String, dynamic>? toJson(TestState state) {
return {'value': state.testString};
}
}
基本用戶界面
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
BlocConsumer<TestBloc, TestState>(
listener: (context, state) {},
builder: (context, state) {
return Text(state.testString);
}),
ElevatedButton(
onPressed: () =>
context.read<TestBloc>().add(ChangeStringToSaved()),
child: Text('Change to Saved'),
),
ElevatedButton(
onPressed: () => context.read<TestBloc>().add(UpdateSaved()),
child: Text('Update Saved'),
),
],
),
),
);
}
}
每當我更新testString
,它都會在重新啟動后自動testString
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.