flutter Selector 使用

在 Flutter 中,Selectorprovider 包中的一个组件,用于在状态管理中高效地选择和监听特定部分的状态变化。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 中选择你关心的部分数据。它接收两个参数:contextmodel,并返回你关心的数据。

  • 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 重建,提高应用的性能。

相关推荐
程序员老刘1 天前
老刘给大家道个歉
flutter·ai编程
binbin_521 天前
Flutter 开发鸿蒙实战:Windows 环境下从 HAP 构建到四 Tab 页面运行
windows·flutter·harmonyos
阳光予你1 天前
Flutter 字体渲染与字重
flutter
恋猫de小郭1 天前
Flutter 开发怎么做 Agent ?从工程实战详细给你解读下
android·前端·flutter
binbin_521 天前
Flutter 调用鸿蒙原生组件:MethodChannel 与 PlatformView 的选择和落地
开发语言·深度学习·flutter·harmonyos
GitLqr2 天前
Flutter 3.44 插件内置 Kotlin (KGP) 双向兼容适配指南
android·flutter·dart
SoaringHeart4 天前
Flutter进阶:基于 EasyRefresh 的下拉刷新封装 n_easy_refresh_mixin.dart
前端·flutter
月光下的丝瓜5 天前
Flutter 国内安装指南
前端·flutter
恋猫de小郭7 天前
Amper 正式转正 Kotlin Toolchain ,Gradle 未来何去何从
android·前端·flutter
张风捷特烈7 天前
Flutter 类库大揭秘#02 | path_provider 各平台实现
前端·flutter