在flutte里面的widget,分为stateless和stateful两种,不过他们的相同点是,他们都是不可变的(immutable)。
在StatelessWidget里面通过重写build
方法来返回界面等。
关于StateFulWidget,写了个简单的demo ----> 传送门
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'NoWay',
home: new ContentWidget()
);
}
}
因为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
});
});