简介:本文详细解析了如何使用Flutter 3.32、DeepSeek API、Dio网络库及Markdown渲染技术,构建支持Windows平台的流式输出AI应用模板,涵盖技术选型、核心实现、优化策略及完整代码示例。
ResponseType.stream可高效处理DeepSeek的流式数据。flutter_markdown包,支持GitHub Flavored Markdown语法,可实时解析AI生成的带格式文本(如代码块、列表、表格)。
graph TDA[UI层] --> B(业务逻辑层)B --> C[数据层]C --> D[DeepSeek API]A --> E[Markdown渲染]B --> F[流式数据处理]
StreamBuilder监听数据流,动态更新MarkdownBody。
flutter config --enable-windows-desktopflutter create --platforms=windows ai_template
pubspec.yaml):
dependencies:dio: ^5.3.0flutter_markdown: ^0.6.17http: ^1.1.0 # Dio替代方案(可选)
import 'package:dio/dio.dart';class DeepSeekClient {final Dio _dio = Dio();final String _apiKey = 'your_api_key';Stream<String> streamGenerate(String prompt) async* {try {final response = await _dio.post('https://api.deepseek.com/v1/chat/completions',data: {'model': 'deepseek-chat','prompt': prompt,'stream': true,},options: Options(headers: {'Authorization': 'Bearer $_apiKey'},responseType: ResponseType.stream,),);final stream = response.data!.stream;final buffer = StringBuffer();await for (final List<int> chunk in stream) {final text = String.fromCharCodes(chunk);// 解析DeepSeek的SSE格式(示例简化)if (text.contains('data: ')) {final jsonData = text.replaceFirst('data: ', '').trim();final Map<String, dynamic> data = jsonDecode(jsonData);buffer.write(data['choices'][0]['text']);yield buffer.toString(); // 流式输出}}} catch (e) {print('API Error: $e');rethrow;}}}
import 'package:flutter/material.dart';import 'package:flutter_markdown/flutter_markdown.dart';class AIChatScreen extends StatefulWidget {@override_AIChatScreenState createState() => _AIChatScreenState();}class _AIChatScreenState extends State<AIChatScreen> {final DeepSeekClient _client = DeepSeekClient();String _output = '';void _sendPrompt(String prompt) {_client.streamGenerate(prompt).listen((text) {setState(() {_output += text; // 增量更新});},onError: (e) => print('Stream Error: $e'),onDone: () => print('Stream Completed'),);}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('DeepSeek AI')),body: Column(children: [Expanded(child: SingleChildScrollView(reverse: true,child: Padding(padding: EdgeInsets.all(16),child: MarkdownBody(data: _output),),),),TextField(onSubmitted: _sendPrompt,decoration: InputDecoration(hintText: '输入问题...'),),],),);}}
data:字段,需合并碎片数据:
final regex = RegExp(r'data:\s*(\{.*?\})\s*\n\n');final matches = regex.allMatches(rawText);for (final match in matches) {final jsonStr = match.group(1)!;// 处理JSON数据}
CancelToken避免界面切换时的内存泄漏:
final cancelToken = CancelToken();_client.streamGenerate(prompt, cancelToken: cancelToken)...// 在dispose()中调用 cancelToken.cancel();
FutureBuilder分批渲染:
FutureBuilder<String>(future: _parseMarkdown(_output),builder: (context, snapshot) {return snapshot.hasData? MarkdownBody(data: snapshot.data!): CircularProgressIndicator();},)
flutter build windows --release# 使用Inno Setup或WiX工具打包
_dio.interceptors.add(InterceptorsWrapper(onRequest: (options, handler) {print('Request: ${options.uri}');return handler.next(options);},onError: (DioError e, handler) {print('Error: ${e.response?.statusCode}');return handler.next(e);},));
本文完整实现了基于Flutter 3.32的Windows流式AI应用,核心优势包括:
推荐学习资源: