哥哥教你Flutter重难点攻克之State和Provider理
什么是State?
我们知道 Flutter 宇宙中万物皆Widget,而Widget是@immutable即不可变的,所以每个Widget状态都代表了一帧。
在这个基础上,StatefulWidget的State帮我们实现了在Widget的跨帧绘制,也就是在每次Widget重绘的时候,通过State重新赋予Widget需要的绘制信息。
setState做了什么?
调用了 markNeedsBuild ,markNeedsBuild 内部会标记 element为 diry,然后在下一帧 WidgetsBinding.drawFrame 才会被绘制,这可以也看出 setState 并不是立即生效的。
什么是Provider?
因为 Flutter 与 React 技术栈的相似性,所以在 Flutter 中涌现了诸如flutter_redux、flutter_dva、flutter_mobx、fish_flutter等前端式的状态管理,它们大多比较复杂,而且需要对框架概念有一定理解。
而作为 Flutter 官方推荐的状态管理scoped_model,又因为其设计较为简单,有些时候不适用于复杂的场景。
所以在经历了一端坎坷之后,今年 Google I/O 大会之后,Provider成了 Flutter 官方新推荐的状态管理方式之一。
它的特点就是:不复杂,好理解,代码量不大的情况下,可以方便组合和控制刷新颗粒度, 而原 Google 官方仓库的状态管理flutter-provide已宣告GG ,provider成了它的替代品。
关于Provider知识点?
1、Provider的内部DelegateWidget是一个StatefulWidget,所以可以更新且具有生命周期。
2、状态共享是使用了InheritedProvider这个InheritedWidget实现的。
3、巧妙利用MultiProvider和Consumer封装,实现了组合与刷新颗粒度控制。