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

相关推荐
一起养小猫36 分钟前
Flutter for OpenHarmony 进阶:体育计分系统与数据持久化深度解析
flutter·harmonyos
ujainu1 小时前
Flutter + OpenHarmony 游戏开发进阶:主菜单架构与历史最高分持久化
flutter·游戏·架构·openharmony
铅笔侠_小龙虾2 小时前
Flutter Demo
开发语言·javascript·flutter
2501_944525542 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 账户详情页面
android·java·开发语言·前端·javascript·flutter
2601_949857432 小时前
Flutter for OpenHarmony Web开发助手App实战:快捷键参考
前端·flutter
mocoding4 小时前
flutter通信小能手pigeon三方库已完成鸿蒙化适配
flutter·华为·harmonyos
一起养小猫4 小时前
Flutter for OpenHarmony 实战:2048游戏完整开发指南
flutter·游戏·harmonyos
血色橄榄枝6 小时前
13-14 底部选项卡 flutter on openHarmony
flutter·开源·鸿蒙
一起养小猫6 小时前
Flutter for OpenHarmony 实战:排球计分系统完整开发指南
flutter·harmonyos
一起养小猫8 小时前
Flutter for OpenHarmony 实战:推箱子游戏完整开发指南
flutter·游戏·harmonyos