博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flutter Widget简介
阅读量:7197 次
发布时间:2019-06-29

本文共 4027 字,大约阅读时间需要 13 分钟。

Widget 概念

首先我们需要了解下 widget 的概念,google 翻译过来叫小部件。将 widget 想象为一个可视化组件或与应用可视化方面交互的组件,同 view 可视化控件不同的是,widget 不是一个控件,而是对控件的描述,其实我们也不必非要纠结概念这个东西,当你用的多了,也就领悟这个概念了。

在 flutter 中,所有的东西都是 widget ,下面代码中可以看到 Text 、AppBar、 AppDemo、Scaffold 都是widget 。

class AppDemo extends StatelessWidget {	@override	Widget build(BuildContext context) {    return new Scaffold(      appBar: new AppBar(        title: new Text('flutter'),      ),      body: new Center(        child:new Text('content'),      ),		);  }}复制代码

flutter 的核心思想就是用 widget 构建你的 UI 。并且它提供了一套丰富、强大的基础 widget ,可参考 :

Widget 状态

在 flutter 中,widget 是不可变的,你需要去操纵 widget 的 state。widget 有状态跟无状态的区分。

无状态 StatelessWidget

StatelessWidget ( 无状态的 widget ) 在你构建初始化后不再进行改变。

例如上面例子,代码中的 child: new Text('content') 这个内容 content 不会变。那么我们就可以用 StatelessWidget 的 Text 。假如我们点击按钮后希望内容改变,我们就需要了解下有状态的 widget 。

有状态 StatefulWidget

StatefulWidget ( 有状态的 widget ) 拥有一个 state 对象来存储它的状态数据,并在 widget 树重建时携带着它,因此状态不会丢失。一个 StatefulWidget 类对应一个 state 类,state 是与对应 StatefulWidget 维护的状态,

当 state 被改变时,调用 setState() 方法通知 flutter framework 状态发生改变,重新调用 build 方法构建 widget 树,来进行更新操作,看下面实例。

class AppDemo extends StatefulWidget {	@override	createState() => _AppDemoState();}class _AppDemoState extends State
{ String _content = "content"; void _updateContent() { setState((){ _content = "flutter content"; }); } @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: TextPage(title: 'flutter',), ), body: new Center( child:new Text(_content), ), floatingActionButton: FloatingActionButton( onPressed: _updateContent, child: Icon(Icons.mode_edit), ), ); }}复制代码

当点击按钮后,显示的内容就会更改为 flutter content

Widget 生命周期

对于一个前端开发,我们都比较关心生命周期这个话题,同样理解 Widget 生命周期对 flutter 开发也是这样的,例子:通过一个计数器 widget 的例子来理解这个话题。

class CounterWidget extends StatefulWidget {	CounterWidget({
this.initCounter:0}); final int initCounter; @override createState() => _CounterWidgetState();}class _CounterWidgetState extends State
{ int _counter; @override void initState() { super.initState(); _counter = widget.initCounter; print('***************initState $_counter***************'); } @override Widget build(BuildContext context) { print('***************build***************'); return Center( child: RaisedButton( child: Text('$_counter'), onPressed: ()=>setState(()=>++_counter), ), ); } @override void didUpdateWidget(CounterWidget oldWidget) { super.didUpdateWidget(oldWidget); print('***************didUpdateWidget***************'); } @override void deactivate() { super.deactivate(); print("***************deactive***************"); } @override void dispose() { super.dispose(); print("***************dispose***************"); } @override void reassemble() { super.reassemble(); print("***************reassemble***************"); } @override void didChangeDependencies() { super.didChangeDependencies(); print("***************didChangeDependencies***************"); }}复制代码

通过现象得结论:

debug 启动运行结果:

***************initState 0*************** ***************didChangeDependencies******************************build***************复制代码

initState :该 widiget 插入到 widget 树结构时被调用,只调用一次,因此,该函数一般用来初始化操作,状态初始化、订阅子树事件通知。

didChangeDependencies():当调用 initState 后会立即调用这个方法,这个方法是在 state 对象被创建好了但没有准备好构建 build 的时候调用的。

build : 调用这个方法来构建 widget 子树。触发的时机较多如:调用 initState()didChangeDependencies()setState()didUpdateWidget()等方法后重新 build。

点击保存按钮执行结果:

***************reassemble******************************didUpdateWidget******************************build***************复制代码

reassemble():专门为了开发调试而提供的,在热重载时会被调用。

didUpdateWidget():在 widget 重新构建时,由 flutter framework 判断检测 widget 树种同一位置新旧节点,决定是否更新,调用该方法。

移除 CounterWidget 执行结果:

***************reassemble******************************deactive******************************dispose***************	复制代码

deactive:当widget 对象从树中被移除时,会调用此方法。

dispose:当 widget 对象从树中被永久移除时调用 ,可以在此方法中释放资源。

点击按钮执行结果:

***************build***************复制代码

转载于:https://juejin.im/post/5ce7c817f265da1bad56dffa

你可能感兴趣的文章
每日一题_JavaScript.利用纯JavaScript Dom Core实现图片轮播效果?
查看>>
一场由于ssl证书过期造成的扯蛋加班
查看>>
Android ScrollView嵌套GridView和ListView等可滑动容器冲突解决方案
查看>>
CentOS7下yum源的配置与使用
查看>>
Centos 磁盘管理(一)
查看>>
ie7下vertical-align的怪异表现
查看>>
Java 遍历文件夹的几种方式及简单性能对比
查看>>
弹出层效果
查看>>
centos6.5
查看>>
log4j2初遇
查看>>
java配置方式
查看>>
apache和php、mysql的整合
查看>>
linux下磁盘多路径
查看>>
安装完oracle9i 运行netca dbca 报错
查看>>
mvc 当前上下文中不存在名称“ViewBag” 或ViewData
查看>>
Exchange Server 2013 用户OWA的相关配置
查看>>
Ubuntu14.04下的LDAP的搭建配置说明
查看>>
一些截图
查看>>
AndroidStudio中使用Android.mk
查看>>
YII2.0 高级模板-添加自定义模板
查看>>