MST

星途 面试题库

面试题:Flutter中Future与async/await的基础应用

在Flutter中,如何使用Future和async/await来异步获取网络数据,并在获取成功后更新UI?请写出关键代码片段,并解释每一步的作用。
15.2万 热度难度
前端开发Flutter

知识考点

AI 面试

面试题答案

一键面试
  1. 关键代码片段
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _data = '';

  @override
  void initState() {
    super.initState();
    _fetchData();
  }

  Future<void> _fetchData() async {
    try {
      final response = await http.get(Uri.parse('https://example.com/api/data'));
      if (response.statusCode == 200) {
        setState(() {
          _data = response.body;
        });
      } else {
        print('Request failed with status: ${response.statusCode}.');
      }
    } catch (e) {
      print('Error: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Async Data Fetching'),
      ),
      body: Center(
        child: Text(_data),
      ),
    );
  }
}
  1. 代码解释
    • 导入必要的库
      • import 'package:flutter/material.dart'; 导入Flutter的UI库,用于构建用户界面。
      • import 'package:http/http.dart' as http; 导入HTTP库,用于进行网络请求。
    • 定义页面状态类
      • MyHomePage 是一个继承自 StatefulWidget 的类,它是页面的顶层组件。
      • _MyHomePageState 继承自 State<MyHomePage>,用于管理页面的状态。这里定义了一个 _data 变量,用于存储从网络获取的数据。
    • 初始化数据
      • initState 方法中,调用 _fetchData 方法来开始异步获取数据。initState 方法在State对象插入到树中时被调用,只会调用一次。
    • 异步获取数据方法
      • _fetchData 是一个异步方法,使用 async 关键字声明。
      • final response = await http.get(Uri.parse('https://example.com/api/data'));:使用 http.get 方法发送HTTP GET请求到指定的URL。await 关键字会暂停当前方法的执行,直到 http.get 返回一个响应,确保请求完成后再继续执行后续代码。
      • if (response.statusCode == 200):检查响应的状态码,如果是200,表示请求成功。
      • setState(() { _data = response.body; });:在状态改变时,调用 setState 方法通知Flutter框架状态发生了变化,Flutter会重新构建UI,从而显示新获取的数据。
      • 如果状态码不是200或者发生异常,会在控制台打印相应的错误信息。
    • 构建UI
      • build 方法中,构建一个简单的 Scaffold,其中 Center 组件内的 Text 显示获取到的数据 _data。在初始状态下,_data 为空字符串,获取数据成功后,_data 更新并重新构建UI显示数据。