在 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
会被调用。它接收三个参数:context
、selectedValue
(selector
返回的数据)和child
(child
参数传递的 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 {@overrideWidget 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 重建,提高应用的性能。