| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Flutter _ 状态管理特别篇 ,你连原理都还没弄明白 -> 正文阅读 |
|
[移动开发]Flutter _ 状态管理特别篇 ,你连原理都还没弄明白 |
和Scoped_model一样,Provide也是借助了InheritWidget,将共享状态放到顶层MaterialApp之上。底层部件通过Provier获取该状态,并通过混合ChangeNotifier通知依赖于该状态的组件刷新。 Provide还提供了Provide.stream,让我们能够以处理流的方式处理数据,不过目前还有一些问题,不推荐使用。 Lets do it!我们这里还是以一个简单app为例,详细介绍Provide的用法。其中涉及共享状态以及多个状态之间如何管理。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vkebRyEd-1630663448699)(https://user-gold-cdn.xitu.io/2019/2/20/1690aee3246a13ec?imageslim)] 这两个页面都同时依赖于counter 和 switcher两个不同的状态。并且一个页面改变状态之后另外一个页面状态也随之改变。 该项目完整代码已放在 Github 第一步:添加依赖在pubspec.yaml中添加Provide的依赖。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4LAW7kG9-1630663448702)(https://user-gold-cdn.xitu.io/2019/2/20/1690b552df50d005?imageView2/0/w/1280/h/960/ignore-error/1)]
第二步:创建Model这里实际上它承担了State的职责,但是为了和官方的State区分所以叫做model。
这里我们可以看到,数据和操作数据的方法都在model中,我们可以很清晰的把业务分离出来。 对比Scoped_model可以发现,Provide模式中model不再需要继承Model类,只需要实现Listenable,我们这里混入ChangeNotifier,可以不用管理听众。 通过 notifyListeners 我们可以通知听众刷新。 第三步:将状态放入顶层
ProviderNode封装了InheritWidget,并且提供了 一个providers容器用于放置状态。 ProviderScope 为Provider提供单独的类型空间,它允许多个相同类型的提供者。默认使用ProviderScope(’_default’),存放的时候你可以通过ProviderScope(“name”)来指定key。 添加一组Provider的时候建议使用provideFrom或者provide方法,而不是provideAll,因为它可以检查编译时的类型错误。 Provider.value将counter包装成了_ValueProvider。并在它的内部提供了StreamController从而实现对数据进行流式操作。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gwb6RihA-1630663448703)(https://user-gold-cdn.xitu.io/2019/2/20/1690b6eb597a11ab?imageView2/0/w/1280/h/960/ignore-error/1)] 第四步:获取状态同样的Provide也提供了两种获取State的方法。我们先来介绍第一种,通过Provide小部件获取。
每次通知数据刷新时,builder将会重新构建这个小部件。 builder方法接收三个参数,这里主要介绍第二个和第三个。
scope:通过指定ProviderScope获取该键所对应的状态。在需要使用多个相同类型状态的时候使用。 第二种获取方式:Provide.value(context)
这种方式实际上调用了context.inheritFromWidgetOfExactType找到顶层的_InheritedProviders来获取到顶层providers中的状态。 如何组织多个状态和scoped_model不同的是,provide模式中你可以轻松组织多个状态。只需要将状态provide进provider中就可以了。
获取数据流在将counter添加进providers的过程中进行了一次包装。我们刚才通过分析源码知道了这个操作能够让我们处理流式数据。 通过 Provide.stream(context) 就能获取数据流。需要注意的是,这里每次获取的数据流都
不过在我的使用当中出现了streamTransformer失效的情况。在firstScreen和secondScreen同样应用这一段相同的代码,second screen的where方法能够生效,过滤掉奇数数据,而first screen中则是收到了完整的数据。 需要注意的是,这里每次获取的数据流都会重新创建一条新的流。
关于这个做法还有一些争议,具体可以查看这个issue: 不过这个功能还可以结合rxdart使用,可以通过stream轻松构建Observer,让我们更加灵活的组织数据。 根据多个状态重建小部件当我们一个视图可能依赖于多个状态进行重建的时候,可以使用ProvideMulti小部件。 已知的坑Provide.stream 诡异的手动监听由于 Provide 自动将 Listenable 数据包装并提供了 Provide.stream 接口,让我们可以通过监听这个流,来获取最新事件。但是当我们进行手动监听之后将会发生这件诡异的事情。
|
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 13:00:28- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |