MST

星途 面试题库

面试题:Flutter中Future与Stream的结合使用及原理

在Flutter开发中,有时需要将Future和Stream结合使用,例如在获取一个初始数据(Future操作)后,基于这个数据开启一个流(Stream)来持续接收更新。请阐述这种结合使用的原理,并给出具体的代码示例实现从网络获取一个用户ID(Future),然后基于这个用户ID订阅实时消息流(Stream)。
48.0万 热度难度
前端开发Flutter

知识考点

AI 面试

面试题答案

一键面试

原理阐述

在Flutter中,Future用于处理异步操作的一次性结果,而Stream用于处理异步的数据流,即可能会多次产生数据的序列。结合使用时,通常是先通过Future获取一个初始状态或数据,然后基于这个数据来初始化StreamFuture操作完成后,其结果作为参数传递给Stream相关的创建或订阅逻辑,以开启后续的数据流监听。

代码示例

假设使用http库来模拟网络请求获取用户ID,使用StreamController来创建实时消息流。

import 'dart:async';
import 'package:http/http.dart' as http;

// 模拟从网络获取用户ID
Future<String> fetchUserId() async {
  final response = await http.get(Uri.parse('https://example.com/api/user_id'));
  if (response.statusCode == 200) {
    return response.body;
  } else {
    throw Exception('Failed to load user ID');
  }
}

// 基于用户ID创建实时消息流
Stream<String> subscribeToMessages(String userId) {
  final controller = StreamController<String>();
  // 这里模拟基于userId订阅消息流,实际可能涉及WebSocket等
  Timer.periodic(const Duration(seconds: 2), (timer) {
    controller.add('New message for user $userId');
  });
  return controller.stream;
}

void main() async {
  try {
    final userId = await fetchUserId();
    final messageStream = subscribeToMessages(userId);
    messageStream.listen((message) {
      print(message);
    });
  } catch (e) {
    print('Error: $e');
  }
}

在上述代码中:

  1. fetchUserId函数使用http库发送GET请求获取用户ID,返回一个Future<String>
  2. subscribeToMessages函数基于传入的用户ID创建一个Stream<String>,这里通过StreamController模拟定期生成新消息。
  3. main函数中,先使用await获取用户ID,然后基于该ID订阅实时消息流并监听输出。