用颤音的魔力和“水合群众”的力量(使应用程序状态保持水分和快乐的终极长生不老药)的渴望! ð§§
“水合集体”简化了扑朔迷离的状态持久性,使得存储和恢复应用程序的状态变得毫不费力。告别手动状态序列化和避免序列化 - 这种漂亮的扩展可以解决这一切!使用水合集团,您可以专注于制作应用程序的功能并使用户满意,而不必担心州管理的复杂性。
什么是水合集团,它如何工作?
水合集体是一种强大的扩展名,在颤动的集团包装上建立。它可以自动化状态持久性和恢复过程,从而轻松在不同会话中维护应用程序的状态。当您创建一个BlocProvider
时,水合集体会自动利用fromJson
方法从本地存储中检索存储的状态。
每当集团的状态发生变化时,toJson
方法就会发挥作用。它将当前状态转换为Map<String, dynamic>
格式,然后将其存储在本地存储中。这样可以确保您的应用程序的状态始终是最新的,即使关闭了应用程序或在屏幕之间导航,就可以在需要时恢复。
水合的集团简化了状态持久性的过程,以防止处理手动序列化和避免序列化的麻烦。通过自动化状态管理,它提高了您的应用程序的可靠性并消除了州损失的风险。
水合集团比传统集团的好处
水合的集体 | Bloc | |
---|---|---|
状态持久性 | 自动化状态持久性和恢复。 | 手动状态序列化和避难所。 |
软件包依赖性 | 作为包装扩展的构建:集团 | 直接使用软件包:bloc。 |
复杂性 | 用自动持久性简化了状态管理。 | 需要对状态持久性进行其他处理。 |
初始化 | HydratedBloc如果有的话,请从存储状态初始化。 | bloc从每个启动时从初始状态开始。 |
存储 | 利用本地存储(hive [no sql])来持续状态。 |
没有内置状态存储,留给开发人员。 |
应用可靠性 | 通过防止州损失来增强应用程序可靠性。 | 容易处理状态损失,如果无法正确处理。 |
水合集团入门
使用水合集体是轻而易举的!您有两个开始的选择:
- 通过扩展:您可以通过扩展现有的BLOC类使用水合集体。
sealed class CounterEvent {}
final class CounterIncrementPressed extends CounterEvent {}
class CounterBloc extends HydratedBloc<CounterEvent, int> {
CounterBloc() : super(0) {
on<CounterIncrementPressed>((event, emit) => emit(state + 1));
}
@override
int fromJson(Map<String, dynamic> json) => json['value'] as int;
@override
Map<String, int> toJson(int state) => { 'value': state };
}
- 使用HydratedMixin:
class CounterBloc extends Bloc<CounterEvent, int> with HydratedMixin {
CounterBloc() : super(0) {
on<CounterIncrementPressed>((event, emit) => emit(state + 1));
}
@override
int fromJson(Map<String, dynamic> json) => json['value'] as int;
@override
Map<String, int> toJson(int state) => { 'value': state };
}
要访问和操纵水合集合中的存储对象,请按照以下步骤:
- 通过扩展
Storage
类创建自定义存储类。
class MyHydratedStorage implements Storage {
@override
dynamic read(String key) {
// TODO: implement read
}
@override
Future<void> write(String key, dynamic value) async {
// TODO: implement write
}
@override
Future<void> delete(String key) async {
// TODO: implement delete
}
@override
Future<void> clear() async {
// TODO: implement clear
}
}
- 设置自定义存储实现:
HydratedBloc.storage = MyHydratedStorage();
在自定义存储类中,您可以实现读取,写入,删除和清除数据的方法。这些方法允许您与本地存储进行交互并管理水合集合的数据。
让我们创建一个简单的待办事项应用程序
- 创建一个Flutter项目,并将所需的依赖项添加到您的
pubspec.yaml
文件中。
dependencies:
hydrated_bloc: ^9.1.2 //hydrated bloc
path_provider: ^2.0.15 // for getTemporaryDirectory
flutter_easyloading: ^3.0.5 // Helpful for showing loading without context
flutter_bloc: ^8.1.3 //flutter bloc
有关更多信息koude7
- 定义JSON序列化的待办事项模型。
- 创建用于管理任务的托多存储库。
- 定义todo Bloc的可能状态和事件。
- 用水合集团实现todo集团。
- 初始化
main.dart
中的水合集体存储。
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
HydratedBloc.storage = await HydratedStorage.build(
storageDirectory: kIsWeb
? HydratedStorage.webStorageDirectory
: await getTemporaryDirectory(),
);
runApp(const MyApp());
}
- 现在我们留在UI和小部件中,您可以创建自己或参考github-repo。
各种功能以操纵待办事项清单
- 添加新的todo:
if (formKey.currentState!.validate()) {
BlocProvider.of<TodoBloc>(context).add(TodoAdd(TodoModel.fromJson({
'id': DateTime.now().millisecondsSinceEpoch+
Random().nextInt(9999999),
'title': titleText.text,
'description': description.text,
'is_completed': false,
'created_at': DateTime.now().toUtc().toIso8601String(),
'updated_at': DateTime.now().toUtc().toIso8601String()
})));
Navigator.pop(context);
}
- 更新所有内容:
BlocProvider.of<TodoBloc>(context).add(TodoUpdate(task.id, value!));
- 搅拌一切:
BlocProvider.of<TodoBloc>(context).add(TodoRemove(task.id));
输出
当然!我感谢Hydrated_Bloc包的出色作者和贡献者,包括Felix Angelov和其他产品,感谢他们在为flutter中开发这项强大的国家管理工具方面的出色工作。