水合集合:坚持您的应用状态。
#教程 #codenewbie #android #flutter

用颤音的魔力和“水合群众”的力量(使应用程序状态保持水分和快乐的终极长生不老药)的渴望! ð§§

“水合集体”简化了扑朔迷离的状态持久性,使得存储和恢复应用程序的状态变得毫不费力。告别手动状态序列化和避免序列化 - 这种漂亮的扩展可以解决这一切!使用水合集团,您可以专注于制作应用程序的功能并使用户满意,而不必担心州管理的复杂性。

什么是水合集团,它如何工作?

水合集体是一种强大的扩展名,在颤动的集团包装上建立。它可以自动化状态持久性和恢复过程,从而轻松在不同会话中维护应用程序的状态。当您创建一个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中开发这项强大的国家管理工具方面的出色工作。

源代码 :

Github Repo

跟着我