官方提供了一个context.select
函数,这个也是局部刷新,是触发某个值的时候才进行整体刷新,在一定程度上可以替换Selector
。把注释解掉可以看到不同的效果,代码如下:
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() => runApp(MyApp());
class Count with ChangeNotifier {
int _count = 1;
int _age = 1;
int get count => _count;
int get age => _age;
void increment() {
_count++;
notifyListeners();
}
void incrementAge() {
_age++;
notifyListeners();
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Material App',
home: Scaffold(
appBar: AppBar(
title: Text('Material App Bar'),
),
body: Center(
child: Container(
child: Home(),
),
),
),
);
}
}
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
print('YM---->----');
return ChangeNotifierProvider<Count>(
create: (_) => Count(),
builder: (context, child) {
print('YM---->重新build');
var select = context.select<Count,int>((value){//输入,对应Count,源自Provider提供的内容
return value.count;//输出,对应String,具体参考Selector
});
return Column(
children: [
Text('数值:$select'),//这一句和下一句效果一样
//Text('数值:${context.select((Count c) => c.count)}'),
//这个的含义是只有count的值变化时候才会重新build
// Text('数值:${context.watch<Count>().count}'),
RaisedButton(
onPressed: () {
context.read<Count>().increment();//这个会触发build
// context.read<Count>().incrementAge();//这个不会触发build
},
child: Text('计数'),
),
],
);
},
);
}
}