Flutter数据通知插件value_notifier_tools的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter数据通知插件value_notifier_tools的使用

value_notifier_tools 是一个轻量级的工具包,用于增强 ValueNotifier 的功能。它提供了多种扩展功能,如历史记录、选择监听和条件过滤等。以下是该插件的详细使用方法及示例。

安装 💻

首先,确保你的机器上已经安装了 Dart SDK。然后可以通过以下命令安装 value_notifier_tools

dart pub add value_notifier_tools

特性

  • HistoryValueNotifier:允许撤销和重做状态更改。
  • SelectValueNotifier:选择并监听 ValueNotifier 的子集状态。
  • WhereValueNotifier:通过自定义谓词来决定哪些状态更改应该传播给监听器。
  • 无依赖:不依赖其他包,非常轻量。
  • 易用性:易于集成到现有项目中。

HistoryValueNotifier 使用示例

直接使用

如果不需要额外的功能,可以直接使用 HistoryValueNotifier

import 'package:history_value_notifier/history_value_notifier.dart';

final notifier = HistoryValueNotifier<int>(0);
notifier.value = 1;
print(notifier.undo()); // 输出 0
print(notifier.redo()); // 输出 1

升级现有的 ValueNotifier

你可以通过混合使用 HistoryValueNotifierMixin 来升级现有的 ValueNotifier

class CounterNotifier extends ValueNotifier<int> with HistoryValueNotifierMixin<int> {
  CounterNotifier() : super(0) {
    maxHistoryLength = 30; // 设置历史记录的最大长度
  }

  void increment() => ++state;

  void decrement() => --state;

  void reset() => temporaryState = 0; // 不会存储在历史记录中

  @override
  int transformHistoryState(int newState, int currentState) {
    return newState;
  }
}

创建 HistoryValueNotifier

你也可以直接创建一个 HistoryValueNotifier

class CounterNotifier extends HistoryValueNotifier<int> {
  CounterNotifier() : super(0);

  void increment() => ++state;
  void decrement() => --state;
}

使用

// 假设我们通过 Provider 或 GetIt 获得了 notifier
final CounterNotifier notifier = context.read(counterNotifier);

notifier.increment(); // 状态变为 1
notifier.undo(); // 撤销,状态变为 0
notifier.redo(); // 重做,状态变为 1

notifier.decrement(); // 状态变为 0
notifier.undo(); // 撤销,状态变为 1
print(notifier.canRedo); // true
notifier.increment(); // 状态变为 2
print(notifier.canRedo); // false

SelectValueNotifier 使用示例

使用便捷的 select 扩展方法

final notifier = ValueNotifier({'a': 1, 'b': 2});

return ValueListenableBuilder<int>(
  valueListenable: notifier.select((value) => value['a']),
  builder: (context, value, child) {
    return Text(value.toString());
  },
);

在这个例子中,ValueListenableBuilder 只会在 'a' 的值改变时重建。

WhereValueNotifier 使用示例

使用 where 扩展方法

final notifier = ValueNotifier(0);

return ValueListenableBuilder<int>(
  valueListenable: notifier.where((oldState, newState) => newState > oldState),
  builder: (context, value, child) {
    return Text(value.toString());
  },
);

这个例子中,Widget 只有在新状态大于旧状态时才会重建。

扩展自定义类

class IncreasingValueNotifier<T> extends WhereValueNotifier<T> {
  IncreasingValueNotifier(super.value);

  @override
  bool updateShouldNotify(T oldState, T newState) {
    return oldState < newState;
  }
}

通过扩展 WhereValueNotifier 并重写 updateShouldNotify 方法,可以实现更复杂的逻辑。

完整示例 Demo

下面是一个完整的示例,展示了如何结合这些功能在一个简单的计数器应用中使用:

import 'package:flutter/material.dart';
import 'package:history_value_notifier/history_value_notifier.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('ValueNotifier Tools Example')),
        body: Center(child: Counter()),
      ),
    );
  }
}

class Counter extends StatefulWidget {
  @override
  _CounterState createState() => _CounterState();
}

class _CounterState extends State<Counter> {
  final CounterNotifier _counter = CounterNotifier();

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        ValueListenableBuilder<int>(
          valueListenable: _counter,
          builder: (context, value, child) {
            return Text('Count: $value');
          },
        ),
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            ElevatedButton(
              onPressed: () => _counter.increment(),
              child: Text('Increment'),
            ),
            ElevatedButton(
              onPressed: () => _counter.decrement(),
              child: Text('Decrement'),
            ),
            ElevatedButton(
              onPressed: () => _counter.undo(),
              child: Text('Undo'),
            ),
            ElevatedButton(
              onPressed: () => _counter.redo(),
              child: Text('Redo'),
            ),
          ],
        )
      ],
    );
  }
}

class CounterNotifier extends HistoryValueNotifier<int> {
  CounterNotifier() : super(0);

  void increment() => ++state;
  void decrement() => --state;
}

这个示例展示了一个简单的计数器应用,用户可以增加或减少计数值,并且可以撤销和重做操作。希望这些内容对你有所帮助!


更多关于Flutter数据通知插件value_notifier_tools的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据通知插件value_notifier_tools的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,value_notifier_tools 是一个 Flutter 插件,它提供了一些工具来简化 ValueNotifier 的使用。ValueNotifier 是 Flutter 提供的一个用于在 widget 树中高效传递和监听数据的类。value_notifier_tools 可以帮助我们更方便地管理这些通知器。

以下是一个简单的代码示例,展示如何使用 value_notifier_tools 来管理一个计数器的状态:

首先,确保在你的 pubspec.yaml 文件中添加 value_notifier_tools 依赖:

dependencies:
  flutter:
    sdk: flutter
  value_notifier_tools: ^最新版本号  # 请替换为实际的最新版本号

然后运行 flutter pub get 来获取依赖。

接下来,编写一个 Flutter 应用,使用 value_notifier_tools 来管理计数器的状态:

import 'package:flutter/material.dart';
import 'package:value_notifier_tools/value_notifier_tools.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class CounterNotifier extends ValueNotifier<int> {
  CounterNotifier() : super(0);

  void increment() {
    value++;
  }
}

class MyHomePage extends StatelessWidget {
  final CounterNotifier counterNotifier = CounterNotifier();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            ValueNotifierProvider<int>(
              create: (_) => counterNotifier,
              child: ValueNotifierListener<int>(
                onChanged: (newValue) {
                  print('Counter value changed to $newValue');
                },
                builder: (_, value, __) {
                  return Text(
                    '${value}',
                    style: Theme.of(context).textTheme.headline4,
                  );
                },
              ),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          counterNotifier.increment();
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }

  @override
  void dispose() {
    counterNotifier.dispose();
    super.dispose();
  }
}

在这个示例中,我们做了以下几件事:

  1. 创建了一个 CounterNotifier 类,它继承自 ValueNotifier<int> 并添加了一个 increment 方法来增加计数器的值。
  2. MyHomePage 中,我们创建了一个 CounterNotifier 实例。
  3. 使用 ValueNotifierProvider 来提供这个 CounterNotifier 实例。ValueNotifierProvidervalue_notifier_tools 提供的一个 widget,用于在 widget 树中提供 ValueNotifier
  4. 使用 ValueNotifierListener 来监听 ValueNotifier 的值变化,并在值变化时打印日志。同时,它使用 builder 方法来构建显示当前计数器值的文本 widget。
  5. 添加了一个浮动按钮来增加计数器的值。

请注意,这个示例假设 value_notifier_tools 提供了 ValueNotifierProviderValueNotifierListener。实际上,这些类可能不是 value_notifier_tools 提供的标准部分,而是类似于 provider 包中的功能。如果 value_notifier_tools 没有提供这些类,你可以使用 provider 包中的 ChangeNotifierProviderConsumer 来实现类似的功能。

如果 value_notifier_tools 确实提供了这些类,上述代码应该能够正常工作。否则,你可能需要调整代码以适应实际的库功能。

回到顶部