在 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会被调用,并返回一个新的Textwidget。 -
Consumer<CounterModel>: 这是一个普通的Consumer,用于监听CounterModel的变化,并在按钮点击时调用increment方法。
总结
Selector 是一个非常强大的工具,可以帮助你在使用 Provider 进行状态管理时,只监听你关心的部分数据,从而避免不必要的 widget 重建,提高应用的性能。