简介:本文详细阐述如何利用Flutter 3.32、DeepSeek大模型、Dio网络库及Markdown渲染技术,构建支持流式输出的Windows平台AI交互模板。通过分模块实现网络通信、模型调用、文本渲染等核心功能,提供从环境配置到完整实现的系统性指导。
采用分层架构模式:
graph TDA[UI层] --> B[业务逻辑层]B --> C[网络通信层]C --> D[DeepSeek API]B --> E[Markdown解析]E --> A
Flutter SDK安装:
flutter doctor --windows-desktop# 确保Windows工具链完整flutter config --enable-windows-desktop
依赖管理:
dependencies:flutter:sdk: flutterdio: ^5.3.0flutter_markdown: ^0.6.0+3http_parser: ^4.0.2 # Dio依赖
Windows权限配置:
windows/runner/main.cpp中添加网络权限声明windows/flutter/generated_plugin_registrant.cc确保插件注册Dio全局配置:
final dio = Dio(BaseOptions(baseUrl: 'https://api.deepseek.com',connectTimeout: const Duration(seconds: 10),receiveTimeout: const Duration(seconds: 30),));// 添加日志拦截器dio.interceptors.add(LogInterceptor(responseBody: true));
Markdown安全配置:
MarkdownWidget(data: markdownText,styleSheet: MarkdownStyleSheet(p: TextStyle(color: Colors.black87),code: TextStyle(backgroundColor: Colors.grey[100]),),onTapLink: (text, href, title) => _launchUrl(href!),)
DeepSeek API的流式响应采用Server-Sent Events(SSE)协议,Dio通过StreamTransformer实现解析:
Future<void> fetchStreamResponse() async {final response = await dio.get('/v1/chat/completions',options: Options(headers: {'Authorization': 'Bearer $apiKey'},responseType: ResponseType.stream,),);final stream = response.data!.stream.transform(utf8.decoder).transform(const LineSplitter()).where((line) => line.startsWith('data: ')).map((line) => jsonDecode(line.substring(6))).map((json) => json['choices'][0]['delta']['content'] ?? '');stream.listen((chunk) {setState(() {_responseText += chunk;});});}
采用ChangeNotifier模式管理对话状态:
class ChatModel extends ChangeNotifier {final List<Message> _messages = [];bool _isTyping = false;List<Message> get messages => [..._messages];bool get isTyping => _isTyping;Future<void> sendMessage(String content) async {_messages.add(Message(content: content, role: 'user'));notifyListeners();_isTyping = true;notifyListeners();final response = await fetchStreamResponse(content);_messages.add(Message(content: response, role: 'assistant'));_isTyping = false;notifyListeners();}}
实现带语法高亮的代码块渲染:
Widget _buildMarkdownContent(String text) {return SingleChildScrollView(child: Padding(padding: const EdgeInsets.all(16.0),child: MarkdownBody(data: text,selectable: true,syntaxHighlighter: SyntaxHighlighter(style: Theme.of(context).textTheme.bodyMedium!,theme: const CodeTheme(backgroundColor: Color(0xFFF5F5F5),commentStyle: TextStyle(color: Colors.greenAccent[700]),keywordStyle: TextStyle(color: Colors.blueAccent),),),),),);}
dio.interceptors.add(InterceptorsWrapper(onRequest: (options, handler) {options.headers['x-retry-count'] =(options.headers['x-retry-count'] ?? 0) + 1;return handler.next(options);},onError: (e, handler) async {if (e.type == DioErrorType.connectTimeout &&e.requestOptions.headers['x-retry-count'] < 3) {return handler.resolve(await _retryRequest(e.requestOptions));}return handler.next(e);},));
ValueNotifier替代频繁的setState调用
Timer? _debounceTimer;void _updateText(String newText) {_debounceTimer?.cancel();_debounceTimer = Timer(const Duration(milliseconds: 100), () {setState(() {_responseText = newText;});});}
windows/flutter/generated_plugins.cmake中确保所有插件正确链接windows/runner/resources/app_icon.ico
flutter build windows --release
flutter-app来源flutter_markdown版本兼容性hive或sqflite存储对话历史
class ChatScreen extends StatefulWidget {const ChatScreen({super.key});@overrideState<ChatScreen> createState() => _ChatScreenState();}class _ChatScreenState extends State<ChatScreen> {final _textController = TextEditingController();final _scrollController = ScrollController();final _chatModel = ChatModel();@overridevoid dispose() {_textController.dispose();_scrollController.dispose();super.dispose();}Future<void> _handleSubmit() async {final text = _textController.text.trim();if (text.isEmpty) return;await _chatModel.sendMessage(text);_textController.clear();_scrollToBottom();}void _scrollToBottom() {WidgetsBinding.instance.addPostFrameCallback((_) {_scrollController.animateTo(_scrollController.position.maxScrollExtent,duration: const Duration(milliseconds: 300),curve: Curves.easeOut,);});}@overrideWidget build(BuildContext context) {return ChangeNotifierProvider(create: (_) => _chatModel,child: Scaffold(appBar: AppBar(title: const Text('AI助手')),body: Column(children: [Expanded(child: Consumer<ChatModel>(builder: (context, model, child) {return ListView.builder(controller: _scrollController,itemCount: model.messages.length,itemBuilder: (context, index) {final msg = model.messages[index];return _MessageBubble(message: msg);},);},),),if (_chatModel.isTyping)const Padding(padding: EdgeInsets.all(8.0),child: Align(alignment: Alignment.centerRight,child: CircularProgressIndicator(),),),Padding(padding: const EdgeInsets.all(8.0),child: Row(children: [Expanded(child: TextField(controller: _textController,decoration: const InputDecoration(hintText: '输入问题...',border: OutlineInputBorder(),),onSubmitted: (_) => _handleSubmit(),),),IconButton(icon: const Icon(Icons.send),onPressed: _handleSubmit,),],),),],),),);}}class _MessageBubble extends StatelessWidget {final Message message;const _MessageBubble({required this.message});@overrideWidget build(BuildContext context) {final isUser = message.role == 'user';return Padding(padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),child: Row(crossAxisAlignment: CrossAxisAlignment.start,children: [if (!isUser)const Padding(padding: EdgeInsets.only(right: 8.0),child: CircleAvatar(child: Icon(Icons.robot)),),Expanded(child: Container(padding: const EdgeInsets.all(12),decoration: BoxDecoration(color: isUser ? Colors.blue[100] : Colors.grey[100],borderRadius: BorderRadius.circular(8),),child: _buildMarkdownContent(message.content),),),if (isUser)const Padding(padding: EdgeInsets.only(left: 8.0),child: CircleAvatar(child: Icon(Icons.person)),),],),);}Widget _buildMarkdownContent(String text) {return MarkdownBody(data: text,styleSheet: MarkdownStyleSheet(p: TextStyle(fontSize: 16),code: TextStyle(backgroundColor: Colors.grey[200],fontFamily: 'CourierNew',),),);}}
本文系统阐述了基于Flutter 3.32构建Windows平台AI应用的全流程,通过整合DeepSeek流式API、Dio网络库和Markdown渲染技术,实现了高效、稳定的实时对话体验。开发者可基于此框架快速构建定制化AI应用,后续可扩展多模型支持、本地缓存等高级功能。