对 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 主打的数据上的细粒度功能,真的戳到你的痛点了吗?

相关推荐
AI_零食7 小时前
声音分贝模拟与波动动画展示:鸿蒙Flutter框架 实现的声音可视化应用
学习·flutter·华为·开源·harmonyos
独特的螺狮粉8 小时前
Flutter 框架跨平台鸿蒙开发 - 关系测试应用
flutter·华为·架构·开源·鸿蒙
autumn20059 小时前
Flutter 框架跨平台鸿蒙开发 - 颜色情绪
flutter·华为·harmonyos
Utopia^10 小时前
Flutter 框架跨平台鸿蒙开发 - 记忆热力图
flutter·华为·harmonyos
2301_8227032010 小时前
Flutter 框架跨平台鸿蒙开发 - 创意声音合成器应用
算法·flutter·华为·harmonyos·鸿蒙
恋猫de小郭10 小时前
Android 上为什么主题字体对 Flutter 不生效,对 Compose 生效?Flutter 中文字体问题修复
android·前端·flutter
李李李勃谦11 小时前
Flutter 框架跨平台鸿蒙开发 - 创意灵感收集
android·flutter·harmonyos
空中海11 小时前
2.7 列表与滚动性能优化
flutter·性能优化·dart
2301_8227032012 小时前
Flutter 框架跨平台鸿蒙开发 - 气味记忆唤醒应用
flutter·华为·开源·harmonyos·鸿蒙
空中海12 小时前
2.4 绘制与动画
flutter·dart