Flutter状态持久化插件state_holder的使用

Flutter状态持久化插件state_holder的使用

StateHolder

StateHolder 是一个围绕 InheritedWidget 的封装,旨在使其更易于使用且更具可重用性。通过使用 StateHolder 而不是手动编写 InheritedWidget,您可以获得以下好处:

  • 资源分配简化
  • 懒加载
  • 大幅减少每次创建新类时的样板代码
  • 对开发者工具友好
  • 对具有指数级复杂度增长的监听机制(如 ChangeNotifier)有更好的扩展性(O(N) 的通知分发)

添加依赖

pubspec.yaml 文件中更新依赖项:

dependencies:
  state_holder:
    git:
      url: https://github.com/mishrabroshan/state_holder.git

组件

状态组件 访问组件
SimpleStateHolder SateHolder
ChangeNotifierStateHolder StateConsumer
MultiStateHolder StateHolderContext

状态组件

SimpleStateHolder 组件

描述:

使用此组件初始化 [SimpleStateHolder],它仅用于保存状态而不会提供任何更改更新。

如何使用:

只需将此组件包裹到小部件中即可开始使用。

import 'package:state_holder/state_holder.dart';

SimpleStateHolder(
  builder: (context) => "[State]", // 状态值
  lazy: true/false, // 是否懒加载
  child: SomeWidget(), // 子小部件
),

ChangeNotifierStateHolder 组件

描述:

使用此组件初始化 [ChangeNotifierStateHolder],它不仅保存状态还会提供更改更新。

注意:

ChangeNotifierStateHolder 只能与可监听组件一起使用。

如何使用:

同样,只需将其包裹到小部件中即可。

import 'package:state_holder/state_holder.dart';

ChangeNotifierStateHolder(
  builder: (context) => "[State]", // 状态值
  lazy: true/false, // 是否懒加载
  child: SomeWidget(), // 子小部件
),

MultiStateHolder 组件

描述:

[StateHolder] 将多个状态持有者合并为单一线性小部件树。这样可以提高可读性并减少嵌套多个状态持有者的样板代码。

例如,从:

import 'package:state_holder/state_holder.dart';

StateHolder<Something>(
  builder: (context) => Something(),
  child: StateHolder<SomethingElse>(
    builder: (context) => SomethingElse(),
    child: StateHolder<AnotherThing>(
      builder: (context) => AnotherThing(),
      child: App(),
    ),
  ),
),

转换为:

import 'package:state_holder/state_holder.dart';

MultiStateHolder(
  stateHolders: [
    StateHolder<Something>(
      builder: (context) => Something(),
    ),
    StateHolder<SomethingElse>(
      builder: (context) => SomethingElse(),
    ),
    StateHolder<AnotherThing>(
      builder: (context) => AnotherThing(),
    ),
  ],
  child: App(),
),

访问组件

StateHolder 组件

描述:

提供简单接口以从任何地方访问状态组件。

方法:

StateHolder.of<T>(BuildContext context, [bool listen = false])

  • 使用此方法获取最近的状态持有者,其中 [T] 是所需状态持有者的类型,context 是请求状态的小部件的上下文。
  • 如果设置 [listen]true,则会将此状态添加到上下文的依赖项中。每当状态内部的值发生变化时,依赖项会被重新构建。
  • 默认情况下,参数为 false

注意:

只有 [ChangeNotifierStateHolder] 具有重建其依赖项的能力。

示例:

import 'package:state_holder/state_holder.dart';

// 在小部件树中的某个位置
MultiStateHolder(
  stateHolders: [
    StateHolder(
      builder: (context) => "HelloWorld",
    ),
    ChangeNotifierStateHolder(
      builder: (context) => ValueNotifier(10),
    ),
  ],
  child: SomeWidget(),
),

class SomeWidget extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    var nonListnableDaa = StateHolder.of<String>(context);
    var listnableData = StateHolder.of<ValueNotifier<int>>(context, true);
    return AnotherWidget();
  }
}

StateConsumer 组件

描述:

获取 [StateHolder]

示例:

import 'package:state_holder/state_holder.dart';

// 在小部件树中的某个位置
StateHolder(
  builder: (context) => "HelloWorld",
  child: SomeWidget(),
)

Widget foo() {
  return StateConsumer<String>(
    builder: (context, state, child) {
      return SomeWidget();
    },
  );
}

StateHolderContext 组件

描述:

[StateHolderContext] 是对 [BuildContext] 的扩展,提供了两种方法来读取和观察 [StateHolder] 的状态。

方法:

  • context.readStateHolder<T>();

    • 使用此方法读取 [StateHolder] 的状态而不监听更新。
    • 类似于:
      StateHolder.of<T>(context, false);
      
  • context.watchStateHolder<T>();

    • 使用此方法观察 [StateHolder] 的状态并监听更新。
    • 类似于:
      StateHolder.of<T>(context, true);
      

示例:

import 'package:state_holder/state_holder.dart';

// 在小部件树中的某个位置
StateHolder(
  builder: (context) => "HelloWorld",
  child: SomeWidget(),
)

class SomeWidget extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    String state = context.readStateHolder<String>();
    ValueNotifier<int> listnableState = context.watchStateHolder<ValueNotifier<int>>();
    return AnotherWidget();
  }
}

更多关于Flutter状态持久化插件state_holder的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter状态持久化插件state_holder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


state_holder 是一个用于 Flutter 应用状态管理的插件,它允许你在应用的不同部分之间共享和持久化状态。使用 state_holder,你可以轻松地管理应用的状态,并在需要时将其持久化到本地存储中。

安装 state_holder

首先,你需要在 pubspec.yaml 文件中添加 state_holder 依赖:

dependencies:
  flutter:
    sdk: flutter
  state_holder: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

基本用法

1. 创建一个状态持有者

首先,你需要创建一个继承自 StateHolder 的类来管理你的状态。

import 'package:state_holder/state_holder.dart';

class CounterStateHolder extends StateHolder {
  int _count = 0;

  int get count => _count;

  void increment() {
    _count++;
    notifyListeners(); // 通知监听者状态已更新
  }

  [@override](/user/override)
  Map<String, dynamic> toJson() {
    return {'count': _count};
  }

  [@override](/user/override)
  void fromJson(Map<String, dynamic> json) {
    _count = json['count'] ?? 0;
  }
}

2. 在应用中使用状态持有者

你可以在应用的任何地方使用 StateHolderProvider 来提供状态持有者,并使用 StateHolderConsumer 来监听状态的变化。

import 'package:flutter/material.dart';
import 'package:state_holder/state_holder.dart';
import 'counter_state_holder.dart'; // 导入你创建的状态持有者

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return StateHolderProvider(
      stateHolder: CounterStateHolder(),
      child: MaterialApp(
        home: HomeScreen(),
      ),
    );
  }
}

class HomeScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('State Holder Example'),
      ),
      body: Center(
        child: StateHolderConsumer<CounterStateHolder>(
          builder: (context, stateHolder) {
            return Text(
              'Count: ${stateHolder.count}',
              style: TextStyle(fontSize: 24),
            );
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          StateHolder.of<CounterStateHolder>(context).increment();
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

3. 持久化状态

state_holder 提供了 StateHolderPersistence 类来帮助你将状态持久化到本地存储中。你可以在应用启动时加载状态,并在应用关闭时保存状态。

import 'package:flutter/material.dart';
import 'package:state_holder/state_holder.dart';
import 'counter_state_holder.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 创建状态持有者
  final counterStateHolder = CounterStateHolder();

  // 从本地存储加载状态
  await StateHolderPersistence.load(counterStateHolder);

  runApp(MyApp(counterStateHolder: counterStateHolder));
}

class MyApp extends StatelessWidget {
  final CounterStateHolder counterStateHolder;

  MyApp({required this.counterStateHolder});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return StateHolderProvider(
      stateHolder: counterStateHolder,
      child: MaterialApp(
        home: HomeScreen(),
      ),
    );
  }
}

class HomeScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('State Holder Example'),
      ),
      body: Center(
        child: StateHolderConsumer<CounterStateHolder>(
          builder: (context, stateHolder) {
            return Text(
              'Count: ${stateHolder.count}',
              style: TextStyle(fontSize: 24),
            );
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          StateHolder.of<CounterStateHolder>(context).increment();
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

// 在应用关闭时保存状态
class MyAppState extends State<MyApp> {
  [@override](/user/override)
  void dispose() {
    StateHolderPersistence.save(widget.counterStateHolder);
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container();
  }
}
回到顶部