## Flutter的stateful widget 在flutte里面的widget,分为stateless和stateful两种,不过他们的相同点是,他们都是不可变的(immutable)。 在StatelessWidget里面通过重写`build`方法来返回界面等。 ## demo 关于StateFulWidget,写了个简单的demo ----> [传送门](https://gitee.com/someonedeng/NoWayFlutter.git) #### preview ![preview](https://someonedeng-1253259777.cos.ap-guangzhou.myqcloud.com/Screenshot_2018-07-26-14-56-31-980_com.example.no.png) ``` dart class MyApp extends StatelessWidget{ @override Widget build(BuildContext context) { return new MaterialApp( title: 'NoWay', home: new ContentWidget() ); } } ``` ## State 因为Widget都是不可变的,而想要让界面动态的发生变化,比如,ListView添加了数据后需要更新。 就要使用State来保存和操控Widget(`StatefulWidget`)的状态。 ``` dart class ContentWidget extends StatefulWidget{ @override State createState() { return new ContentWidgetState(); } } ``` 通过重写createState的方式来获取Widget的State对象。 ``` dart class ContentWidgetState extends State { @override void initState() { } @override Widget build(BuildContext context) { return null; } } ``` 在state里面描述了怎么创建StatefulWidget的view。 更重要的是,widget的更新。比如,通过点击一个按钮后,添加数据到listView的数据里边,需要对View更新, ``` dart class StateA extends State{ @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( (){} )`来 通知界面的更新。 调用界面更新最好是异步的,不然好像会报错。。 ``` dart Future fs = 某些地方获取到的,文件、网络等; fs.then((str){ setState(() { // do your job here }); }); ```