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
会被调用。它接收三个参数: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 { @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 重建,提高应用的性能。