Flutter 的 stateful widget#
在 flutte 里面的 widget,分为 stateless 和 stateful 两种,不过他们的相同点是,他们都是不可变的(immutable)。
在 StatelessWidget 里面通过重写build
方法来返回界面等。
demo#
关于 StateFulWidget, 写了个简单的 demo ----> 传送门
preview#
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'NoWay',
home: new ContentWidget()
);
}
}
State#
因为 Widget 都是不可变的,而想要让界面动态的发生变化,比如,ListView 添加了数据后需要更新。
就要使用 State 来保存和操控 Widget(StatefulWidget
)的状态。
class ContentWidget extends StatefulWidget{
@override
State<StatefulWidget> createState() {
return new ContentWidgetState();
}
}
通过重写 createState 的方式来获取 Widget 的 State 对象。
class ContentWidgetState extends State<ContentWidget> {
@override
void initState() {
}
@override
Widget build(BuildContext context) {
return null;
}
}
在 state 里面描述了怎么创建 StatefulWidget 的 view。
更重要的是,widget 的更新。比如,通过点击一个按钮后,添加数据到 listView 的数据里边,需要对 View 更新,
class StateA extends State<ContentWidget>{
@override
Widget build(BuildContext context) {
// TODO: implement build
return new Scaffold(
appBar: new AppBar(
actions: [
new IconButton(
new Icon(Icons.add),
onPressed: (){ addData() },
)
]
),
);
}
// add data to a list
void addData() {
setState(() {
// do your job here
});
}
}
这时候需要调用setState( (){} )
来 通知界面的更新。
调用界面更新最好是异步的,不然好像会报错。。
Future<String> fs = 某些地方获取到的,文件、网络等;
fs.then((str){
setState(() {
// do your job here
});
});