flutter Selector 使用

news/2025/2/8 21:28:01 标签: flutter

在 Flutter 中,Selector 是 provider 包中的一个组件,用于在状态管理中高效地选择和监听特定部分的状态变化。Selector 可以帮助你避免不必要的重建,只在你关心的数据发生变化时才重建 widget。

基本用法

Selector 的基本用法如下:

Selector<MyModel, SelectedType>(
  selector: (context, model) => model.selectedValue,
  builder: (context, selectedValue, child) {
    return SomeWidget(
      value: selectedValue,
      child: child,
    );
  },
  child: SomeChildWidget(),
);

参数说明

  • selector: 这是一个函数,用于从 Provider 中选择你关心的部分数据。它接收两个参数:context 和 model,并返回你关心的数据。

  • builder: 这是一个构建函数,当 selector 返回的数据发生变化时,builder 会被调用。它接收三个参数:contextselectedValueselector 返回的数据)和 childchild 参数传递的 widget)。

  • child: 这是一个可选的参数,用于传递一个不变的 widget。这个 widget 不会因为 selector 的数据变化而重建,可以提高性能。

示例

假设你有一个 CounterModel,它包含一个 count 和一个 doubleCount。你只关心 doubleCount 的变化,可以使用 Selector 来监听 doubleCount 的变化:

class CounterModel with ChangeNotifier {
  int _count = 0;

  int get count => _count;
  int get doubleCount => _count * 2;

  void increment() {
    _count++;
    notifyListeners();
  }
}

class CounterApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (_) => CounterModel(),
      child: Scaffold(
        appBar: AppBar(title: Text('Selector Example')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Selector<CounterModel, int>(
                selector: (context, model) => model.doubleCount,
                builder: (context, doubleCount, child) {
                  return Text(
                    'Double Count: $doubleCount',
                    style: Theme.of(context).textTheme.headline4,
                  );
                },
              ),
              SizedBox(height: 20),
              Consumer<CounterModel>(
                builder: (context, model, child) {
                  return ElevatedButton(
                    onPressed: model.increment,
                    child: Text('Increment'),
                  );
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

解释

  • Selector<CounterModel, int>: 这里我们指定了 Selector 的类型参数,第一个是 CounterModel,第二个是 int,表示我们选择的数据类型是 int

  • selector: (context, model) => model.doubleCount: 我们选择 doubleCount 作为我们关心的数据。

  • builder: (context, doubleCount, child): 当 doubleCount 发生变化时,builder 会被调用,并返回一个新的 Text widget。

  • Consumer<CounterModel>: 这是一个普通的 Consumer,用于监听 CounterModel 的变化,并在按钮点击时调用 increment 方法。

总结

Selector 是一个非常强大的工具,可以帮助你在使用 Provider 进行状态管理时,只监听你关心的部分数据,从而避免不必要的 widget 重建,提高应用的性能。


http://www.niftyadmin.cn/n/5845306.html

相关文章

pytest-xdist 进行多进程并发测试

在自动化测试中&#xff0c;运行时间过长往往是令人头疼的问题。你是否遇到过执行 Pytest 测试用例时&#xff0c;整个测试流程缓慢得让人抓狂&#xff1f;别担心&#xff0c;pytest-xdist 正是解决这一问题的利器&#xff01;它支持多进程并发执行&#xff0c;能够显著加快测试…

QUIC 与 UDP 关系

QUIC协议是建立在UDP之上的,这意味着QUIC的数据包实际上是通过UDP传输的。QUIC的设计使其能够利用UDP的特性,同时在其上实现更复杂的功能。以下是QUIC如何体现出其基于UDP的特性,以及QUIC头部字段的详细介绍。 QUIC与UDP的关系 UDP封装:QUIC数据包被封装在UDP数据包中进行…

实际时钟(RTC)的介绍

一、RTC介绍 RTC&#xff1a;实时时钟(Real-Time Clock)的缩写&#xff0c;是一种集成电路&#xff0c;通常称为时钟芯片。 应用&#xff1a;广泛应用于消费类电子产品&#xff0c;提供精确的实时时间或为电子系统提供时间基准。 工作原理&#xff1a;采用精度较高…

功能架构元模型

功能架构的元模型是对功能架构进行描述和建模的基础框架,它有助于统一不同团队对系统的理解,并为系统的设计和开发提供一致的标准和规范。虽然具体的元模型可能因不同的应用领域和特定需求而有所差异,但一般来说,功能架构的元模型可以涵盖以下几个方面: 组件/模块元模型:…

游戏引擎学习第90天

查看我们现在的进度 目标是完整地手写一个游戏&#xff0c;而不依赖任何现有的游戏引擎或库。这样做的主要原因是希望能够从头到尾掌握游戏开发的全部流程&#xff0c;确保对系统的每个部分都有清晰的理解。此外&#xff0c;现有的引擎和库往往存在各种设计上的问题&#xff0…

如何轻松将Matlab生成的图表嵌入PowerPoint演示文稿

文章目录 Matlab将生成的图添加PPT中一、Matlab脚本1.添加图片函数2.使用示例 总结 Matlab将生成的图添加PPT中 在许多科学、工程和商业领域&#xff0c;Matlab作为一款强大的数值计算和可视化工具&#xff0c;被广泛应用于数据分析和模型构建。然而&#xff0c;当涉及到分享这…

光学和光子学模拟工具在 AR/VR 中的作用

AR/VR 中的光学和光子学 增强现实 (AR) 和虚拟现实 (VR) 站在数字进化的前沿。光学和光子学这一复杂的科学深入研究了光的产生、检测和操控&#xff0c;在这一转变中发挥着至关重要的作用。 图 1 (a) 展示了 AR 系统的设计&#xff0c;强调了光学的关键作用。该图描绘了光的旅…

【大模型】Ubuntu下安装ollama,DeepSseek-R1:32b的本地部署和运行

1 ollama 的安装与设置 ollama官网链接&#xff1a;https://ollama.com/ 在左上角的【Models】中展示了ollama支持的模型在正中间的【Download】中课可以下载支持平台中的安装包。   其安装和模型路径配置操作流程如下&#xff1a; ollama的安装 这里选择命令安装curl -fsSL …