当前位置: 首页 > article >正文

flutter Selector 使用

在 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.kler.cn/a/537044.html

相关文章:

  • 小哆啦探秘《JavaScript高级程序设计》
  • 摄像头模块烟火检测
  • 【centOS】搭建公司内网git环境-GitLab 社区版(GitLab CE)
  • 华水967数据结构2024真题(回忆版)
  • SystemUI中NavigationBar分析
  • 记录 | WPF基础学习Style局部和全局调用
  • StarSpider 星蛛 爬虫 Java框架 可以实现 lazy爬取 实现 HTML 文件的编译,子标签缓存等操作
  • 前端导出pdf,所见即所得
  • 芯科科技的BG22L和BG24L带来应用优化的超低功耗蓝牙®连接
  • Spring Boot 有哪些优点
  • 【Redis】事务因WATCH的键被修改而失败 事务队列中的操作被自动丢弃 UNWATCH的应用场景
  • 视频编辑质量评价的开源项目 VE-Bench 介绍
  • 使用deepseek快速创作ppt
  • 基于物联网技术的智能寻车引导系统方案:工作原理、核心功能及系统架构
  • 如何设置Jsoup请求头模拟浏览器访问?
  • redis之AOF持久化过程
  • Plugin有什么作用?Plugin是什么?
  • 探索robots.txt:网站管理者的搜索引擎指南
  • yolov11模型在Android设备上运行【踩坑记录】
  • 【面试】Java高频面试题(2023最新版)
  • e2studio开发RA2E1(9)----定时器GPT配置输入捕获
  • 5.2Internet及其作用
  • EasyExcel 导出合并层级单元格
  • 技术选型对比:Redis 与 MySQL、Dubbo 与 Spring Cloud
  • Baumer工业相机堡盟相机的相机传感器芯片清洁指南
  • QT全局所有QSS样式实时切换