最近在了解flutter,新写的代码中用到了switch控件,正常的逻辑,点击控件后switch的值应该发生变化,代码如下:
class _SystemConfigState extends State<SystemConfigPage> {
bool _receiveNotification = false;
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView(
children: <Widget>[
......
ListTile(
leading: const Text('接收通知'),
trailing: Switch(
value: _receiveNotification,
onChanged: (newValue) {
_receiveNotification = newValue;
print('new value: $_receiveNotification');
},
),
),
......
这是一个很自然的逻辑,value的值已经绑定,当发生更改时,状态就应该发生改变
然后编译调试,实际的效果却让人大跌眼镜,控件上的值并没有发生改变。
原因在哪里呢?
秘密就藏在了state中,看下官方给的例子,在onChanged中的写法应该是
setState(() => _receiveNotification = newValue);
而不是孤零零的:
_receiveNotification = newValue;
可以看到,如果把flutter的框架看成一个MCV模型的话,M的更新并不会导致V的立即重新绘制,而是要手动的提示框架更新。
在Android开发里面有个类似的东西,listview的数据更改时,需要使用notifyDataSetChanged去提示更新