一直被riverpod洗脑,最后投降了。完整的学习了下,然后在项目中实战了。整体来说好用,比provider方便,也解决之前一直的困扰(监听值变化来执行事件)。
1. widget替换
1.StatelessWidget
替换为ConsumerWidget
。
2.StatefulWidget
和State
替换为ConsumerStatefulWidget
和ConsumerState
。
3.Consumer
可以直接在widget tree中使用。
2. ref的方法 (ref就是ProviderElementBase
)
1.ref.watch
获取一个provider的值并监听变化,等值变化时重建widget。
2.ref.listen
添加一个监听到provider上,当值变化的时候执行一个动作,如打开一个新页面或展示一个新内容。(事件触发用listen)
3.ref.read
获取一个provider的值并忽略值的改变。如在点击事件中获取一个provider的值。
注意点
1. ref.watch
- 多个provider联用,可以在provider通过ref.watch其他的provider来做到自动更新。
- 不应该在async异步中调用,比如在button的onPresssed中。
- 不应该在initState或其他state生命周期中调用。
2. ref.listen
- 传入2个参数ref和(pre, new)回调函数。可在回调函数中进行操作。
- 可在一个provider或build中。
- 不应该在async异步中调用,比如在button的onPresssed中。
- 不应该在initState或其他state生命周期中调用。
3. ref.read
- 获取数据。通常在用户交互中使用。
- 尽量避免使用ref.read,因为他不是反应式的。(即数据变化的时候,不会跟随的变化)
- 不要在build中使用。
4. ref.refresh
- 使之前的provider失效,然后重新获取数据。 (不是立刻重新获取数据&