- 实际添加请参考:pub.dartlang.org/packages/pr…
- 由于版本冲突添加失败请参考: juejin.im/post/684490…
第二步:创建Model
这里实际上它承担了State的职责,但是为了和官方的State区分所以叫做model。
import ‘package:flutter/material.dart’;
class Counter with ChangeNotifier{
int value = 0;
increment(){
value++;
notifyListeners();
}
}
这里我们可以看到,数据和操作数据的方法都在model中,我们可以很清晰的把业务分离出来。
对比Scoped_model可以发现,Provide模式中model不再需要继承Model类,只需要实现Listenable,我们这里混入ChangeNotifier,可以不用管理听众。
通过 notifyListeners 我们可以通知听众刷新。
第三步:将状态放入顶层
void main() {
var counter = Counter();
var providers = Providers();
//将counter对象添加进providers
providers.provide(Provider.value(counter));
runApp(
ProviderNode(
child: MyApp(),
providers: providers),
);
}
ProviderNode封装了InheritWidget,并且提供了 一个providers容器用于放置状态。
ProviderScope 为Provider提供单独的类型空间,它允许多个相同类型的提供者。默认使用ProviderScope(‘_default’),存放的时候你可以通过ProviderScope(“name”)来指定key。
添加一组Provider的时候建议使用provideFrom或者provide方法,而不是provideAll,因为它可以检查编译时的类型错误。
Provider.value将counter包装成了_ValueProvider。并在它的内部提供了StreamController从而实现对数据进行流式操作。
第四步:获取状态
同样的Provide也提供了两种获取State的方法。我们先来介绍第一种,通过Provide小部件获取。
Provide(
builder: (context, child, counter) {
return Text(
‘${counter.value}’,
style: Theme.of(context).textTheme.display1,
);
},
),
每次通知数据刷新时,builder将会重新构建这个小部件。
builder方法接收三个参数,这里主要介绍第二个和第三个。
- 第二个参数child:假如这个小部件足够复杂,内部有一些小部件是不会改变的,那么我们可以将这部分小部件写在Provide的child属性中,让builder不再重复创建这些小部件,以提升性能。
- 第三个参数counter:这个参数代表了我们获取的顶层providers中的状态。
scope:通过指定ProviderScope获取该键所对应的状态。在需要使用多个相同类型状态的时候使用。
第二种获取方式:Provide.value(context)
final currentCounter = Provide.value(context);
这种方式实际上调用了context.inheritFromWidgetOfExactType找到顶层的_InheritedProviders来获取到顶层providers中的状态。
如何组织多个状态
和scoped_model不同的是,provide模式中你可以轻松组织多个状态。只需要将状态provide进provider中就可以了。
void main() {
var counter = Counter();
var switcher = Switcher();
var providers = Providers();
providers
…provide(Provider.value(counter))
…provide(Provider.value(switcher));
runApp(
ProviderNode(
child: MyApp(),
providers: providers)
);
}
获取数据流
在将counter添加进providers的过程中进行了一次包装。我们刚才通过分析源码知道了这个操作能够让我们处理流式数据。
通过 Provide.stream(context) 就能获取数据流。需要注意的是,这里每次获取的数据流都
StreamBuilder(
initialData: currentCounter,
stream: Provide.stream(context)
.where((counter) => counter.value % 2 == 0),
builder: (context, snapshot) =>
Text(‘Last even value: ${snapshot.data.value}’)),
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
最后
对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。
以下是今天给大家分享的一些独家干货:
希望读者们能谨记这一点。
为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。
以下是今天给大家分享的一些独家干货:
[外链图片转存中…(img-l4cgg7dH-1711644214578)]