面试题答案
一键面试原理阐述
在Flutter中,Future
用于处理异步操作的一次性结果,而Stream
用于处理异步的数据流,即可能会多次产生数据的序列。结合使用时,通常是先通过Future
获取一个初始状态或数据,然后基于这个数据来初始化Stream
。Future
操作完成后,其结果作为参数传递给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');
}
}
在上述代码中:
fetchUserId
函数使用http
库发送GET请求获取用户ID,返回一个Future<String>
。subscribeToMessages
函数基于传入的用户ID创建一个Stream<String>
,这里通过StreamController
模拟定期生成新消息。- 在
main
函数中,先使用await
获取用户ID,然后基于该ID订阅实时消息流并监听输出。