面试题答案
一键面试- 定义异步函数
fetchData
:Future<List<dynamic>> fetchData() async { // 模拟网络请求 await Future.delayed(Duration(seconds: 2)); return ['data1', 'data2', 'data3']; }
- 在StatefulWidget的State类中定义数据变量和加载数据的方法:
class MyHomePageState extends State<MyHomePage> { List<dynamic> _data = []; Future<void> _loadData() async { List<dynamic> result = await fetchData(); setState(() { _data = result; }); }
- 在合适的地方调用
_loadData
方法: 例如在initState
方法中调用,这样页面一加载就开始获取数据。@override void initState() { super.initState(); _loadData(); }
- 在UI中展示数据:
@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: ListView.builder( itemCount: _data.length, itemBuilder: (context, index) { return ListTile( title: Text(_data[index].toString()), ); }, ), ); }
为什么要在setState
中更新UI:
- Flutter的
StatefulWidget
的状态改变时需要调用setState
方法。setState
方法会通知Flutter框架,该State
对象的状态已经改变,框架会重新调用build
方法来重建UI。 - 如果不在
setState
中更新UI相关数据,Flutter框架不会知道数据发生了变化,也就不会触发UI的重建,UI将不会展示更新后的数据。