这种方法最常见,但是有些地方引用的话,刷新的成本比较大,刷新的是整个页面,数据太多加载太慢的话,会有闪烁的现象
目前创新互联公司已为近1000家的企业提供了网站建设、域名、雅安服务器托管、网站托管、服务器租用、企业网站设计、下冶网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
这种方法类似于iOS中的set方法,通过设置某个属性的时候,去刷新某个控件。在flutter中这种刷新方式,是对上面setState(){}方法的改进,根本的方法还是setState(){},只不过是通过方法去刷新某个控件。如下:
首先在pubspec.yaml中添加provider依赖
下面通过provider来实现一个发送验证码的案例。
创建一个TimerModel文件
页面布局如下:
Flutter中Widget分为StatefulWidget和StatelessWidget,分别为动态视图和静态视图,视图的更新需要调用StatefulWidget的setState方法,这会遍历调用子Widget的build方法。当一个主页面比较复杂时,会包含多个widget,如果直接调用setState,会遍历所有子Widget的build,这是非常不必要的性能开销,有没有单独刷新指定Widget的方式呢?这个时候就要用到GlobalKey了。
一个StatefulWidget包含一个Button,一个Text,通过点击Button调用主Widget的setState方法,刷新Text,示例如下:
同样一个StatefulWidget包含一个多个Text和Button,点击Button我们只需要刷新指定的Text,通过GlobalKey的方式,实现如下:
主Widget,包含一个需要更新的TextWidget和一个不需要更新的Text
需要单独更新的Widget
传递事件的Button
这样点击Button就只会更新指定的TextWidget了,效果如下:
这只是一个简单的例子,在实际开发中为了页面刷新的高效率,模块化封装非常重要。很多情况下都只需要局部刷新,而不是重构整个视图。所以Globalkey的运用在项目中需要熟练掌握
1.环境准备, 参考链接
2.添加国内环境配置: 参考链接
3.新建
name: String类型,代表Channel的名字,也是其唯一标识符。
messager:BinaryMessenger类型,代表消息信使,是消息的发送与接收的工具。
codec: MessageCodec类型或MethodCodec类型,代表消息的编解码器。
fluuter中的MessageCodec用于二进制格式数据与基础数据之间的编解码。BasicMessageChannel所使用的编解码器就是MessageCodec。
iOS中,名称为FlutterMessageCodec,是一个协议,定义了两个方法:encode接收一个类型为id的消息,将其编码为NSData类型,而decode接收NSData类型消息,将其解码为id类型数据。
MessageCodec有多种不同的实现:
与MessageCodec不同的是,MethodCodec用于MethodCall对象的编解码,一个MethodCall对象代表一次从Flutter端发起的方法调用。MethodCall有2个成员变量:String类型的method代表需要调用的方法名称,通用类型(Android中为Object,iOS中为id)的arguments代表需要调用的方法入参
由于处理的是方法调用,故相比于MessageCodec,MethodCodec多了对调用结果的处理。当方法调用成功时,使用encodeSuccessEnvelope将result编码为二进制数据,而当方法调用失败时,则使用encodeErrorEnvelope将error的code、message、detail编码为二进制数据
MethodCodec有两种实现:
Dart 中所有的类都继承自 Object 类。
打印:
打印:
打印:
打印:
打印:
flutter: 我是匿名方法
flutter: 匿名方法带参数:(100+100)
打印:
打印:
flutter: 自执行方法: 12
打印:
打印:
StatelessWidget是一个抽象类继承自Widget,这个抽象类中定义了build方法:
Widget build(BuildContext context);
功能:
Describes the part of the user interface represented by this widget.
描述这个widget所代表的用户界面的部分,感觉类似于iOS视图控制器中的viewdidload;
调用时机:
The framework calls this method when this widget is inserted into the tree in a given BuildContext and when the dependencies of this widget change (e.g., an InheritedWidget referenced by this widget changes).
framework会调用这个方法:1.当这个widget被插入到给定 BuildContext 的中的时候;2.当widget的依赖改变的时候;
方式:
framework会用这个方法返回的widget取代这个widget下边的子树,或者更新已经存在的子树,或者删除子树用新子树填充;这依赖于方法返回的widget是否可以更新已经存在的子树的根,或者是widget调用canUpdate;
使用条件:
1.这个widget的区域不能随时间改变;
2.从context使用 BuildContext.inheritFromWidgetOfExactType 获得的任何环境状态。