对 signals.dart 细粒度更新的误解

我们使用一个第三方库,不应只看有没有名气,star 多不多,功能强不强大,库的实现原理是否高大上,更应该看它

  • 解决了什么问题

  • 是否符合我们的项目需求

  • 有没有带来新问题

Signal 简介

基于 preactjs.com/blog/signal... 实现了 dart 版。

主打最大的优势是 高性能的颗粒度更新。

Preact Signals

preactjs.com/guide/v10/s...

Preact Signals 是 Preact 团队(React 的轻量替代框架)推出的一种 响应式状态管理机制,核心思想是用极小代价实现"自动追踪依赖 + 精准更新"。

数据处理上的细粒度更新

我对 signals.dart 一直有误解,从他的宣传上,以为他在 flutter ui 上有什么细粒度更新。

郭神之前有篇文章已经介绍了 signal 的原理:guoshuyu.cn/home/wx/Flu...

从 signal 官方的 例子 :github.com/rodydavis/s... 也可以看出,其在 ui 上没有什么细粒度更新,本质上还是 setState 触发 Widget 树的 build。

signal 的细粒度是处理数据时的细粒度。flutter 上还是一样的 setState,flutter Widget 上也并不需要什么细粒度更新,本身就足够高效。

类似于 什么 Consumer/ ProviderBuilder 的局部更新组件其实都是没必要的。直接 setState 并没什么性能丢失。如果真的很频繁,直接用系统自带的 ValueNotifierBuilder

官方例子:

dart 复制代码
class _CounterExampleState extends State<CounterExample> with SignalsMixin {

  late final Signal<int> counter = createSignal(0);

  void _incrementCounter() {

    counter.value++;

  }


  @override

  Widget build(BuildContext context) {

    return Scaffold(

      appBar: AppBar(

        title: const Text('Flutter Counter'),

      ),

      body: Center(

        child: Column(

          mainAxisAlignment: MainAxisAlignment.center,

          children: <Widget>[

            const Text(

              'You have pushed the button this many times:',

            ),

            Text(

              '$counter',

              style: Theme.of(context).textTheme.headlineMedium,

            ),

          ],

        ),

      ),

      floatingActionButton: FloatingActionButton(

        onPressed: _incrementCounter,

        tooltip: 'Increment',

        child: const Icon(Icons.add),

      ),

    );

  }

}

和直接用 ValueNotitier 并没有啥区别,只是 signal 内部帮你自动加了 counter.addListener 而已。

dart 复制代码
class _CounterExampleState2 extends State<CounterExample> {

  late final ValueNotifier<int> counter = ValueNotifier(0);

  @override

  void initState() {

    super.initState();

    counter.addListener(() {

      setState(() {});

    });

  }

  void _incrementCounter() {

    counter.value++;

  }

  @override

  Widget build(BuildContext context) {

    return Scaffold(

      appBar: AppBar(

        title: const Text('Flutter Counter'),

      ),

      body: Center(

        child: Column(

          mainAxisAlignment: MainAxisAlignment.center,

          children: <Widget>[

            const Text(

              'You have pushed the button this many times:',

            ),

            Text(

              '$counter',

              style: Theme.*of*(context).textTheme.headlineMedium,

            ),

          ],

        ),

      ),

      floatingActionButton: FloatingActionButton(

        onPressed: _incrementCounter,

        tooltip: 'Increment',

        child: const Icon(Icons.*add*),

      ),

    );

  }

}

signals.dart 解决的痛点

所以 signals.dart 最大的价值就是处理数据的高效:

dart 复制代码
final a = createSignal(1);
final b = createSignal(2);
final sum = createComputed(() => a.value + b.value);
final doubled = createComputed(() => sum.value * 2);

这种写法就是每个值都是lazy 响应式的。个人观点,我看不出大的优势,我找不到我处理什么数据时什么时候真的需要这种lazy 响应式的场景。这种写法反而不易于阅读和维护。并且绑定了 signal 库,以后要抽成基础组件库也不方便。

总结

所以 signal 主打的数据上的细粒度功能,真的戳到你的痛点了吗?

相关推荐
ZH154558913135 分钟前
Flutter for OpenHarmony Python学习助手实战:自动化脚本开发的实现
python·学习·flutter
晚烛2 小时前
CANN + 物理信息神经网络(PINNs):求解偏微分方程的新范式
javascript·人工智能·flutter·html·零售
一起养小猫2 小时前
Flutter for OpenHarmony 实战:扫雷游戏完整开发指南
flutter·harmonyos
晚烛3 小时前
CANN 赋能智慧医疗:构建合规、高效、可靠的医学影像 AI 推理系统
人工智能·flutter·零售
晚霞的不甘3 小时前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d
小哥Mark4 小时前
Flutter开发鸿蒙年味 + 实用实战应用|绿色烟花:电子烟花 + 手持烟花
flutter·华为·harmonyos
一只大侠的侠6 小时前
Flutter开源鸿蒙跨平台训练营 Day 3
flutter·开源·harmonyos
一只大侠的侠7 小时前
【Harmonyos】Flutter开源鸿蒙跨平台训练营 Day 2 鸿蒙跨平台开发环境搭建与工程实践
flutter·开源·harmonyos
微祎_8 小时前
Flutter for OpenHarmony:构建一个 Flutter 平衡球游戏,深入解析动画控制器、实时物理模拟与手势驱动交互
flutter·游戏·交互
ZH15455891319 小时前
Flutter for OpenHarmony Python学习助手实战:面向对象编程实战的实现
python·学习·flutter