state 和 widget 的蓝图是分开的。
所以widget的顺序发生了变化,state没有变的话,element的树是不会重新渲染的。

statelessWidget 并不会用到key。
statefulWidget 会用到key。

valuekey和 objectkey的区别:valuekey 比较的是对象的内容是否一样。objectkey比较的是对象的内存地址。

uniqueKey可以强行让widget 把状态丢掉。让重新渲染。在动画的时候可用到。Text变化文字内容的时候。

Draggable
ReorderableList
stack + positioned/AnimatedPositioned

Listener

滚动:
listView
ListView.builder [cacheExtent:缓冲区大小]
itemExtent 固定item的大小,防止卡顿。
controlle - ScrollController 操作listview的内容。 animateTo
physics

ListView.separated 带分割线的
Scrollbar

下拉刷新:
RefreshIndicator
NotificationListener

Dismissible

GridView
ListWheelScrollView
RotateBox
pageView
SingleChildScrollView

Align


异步:

eventLoop
eventQueue / microtaskQueue
image.png
image.png

aysnc await try catch

future.then.errorCatch.whenComplete

futureBuilder
image.png
image.png

StreamBuilder, StreamController可以精确控制
StreamBuilder 在监听StreamController里面的数据流。当StreamController里面的数据发生了变化,
StreamBuilder的builder就会调用。
image.png
image.png

一个stream默认只能有一个监听,如果需要有多个监听,就需要将stream变成广播。
image.png

stream.map.where.distinct

image.png
image.png


小例子:
image.png
在flutter的滚动控件中,默认的padding不是0。因为iPhone手机有安全区域。要避开。

每次点击的时候,就发出了一个事件。
image.png