最新研发flutter3.41+deepseek+window_manager零到一构建桌面版AI系统

0 阅读3分钟

爆肝两周!基于flutter3.41.5+dart3.11+get+dio+window_manager集成deepseek api大模型纯手搓高颜值桌面客户端ai流式对话助手。

360截图20260414234801303.png

未标题-p0.png

p4.gif

使用技术

  • 开发工具:VScode
  • 跨平台技术框架:flutter3.41.5+dart3.11.3
  • 大模型框架:deepseek-v3.2
  • 流式请求:dio^5.9.2
  • 路由/状态管理:get^4.7.3
  • 存储服务:get_storage^2.1.1
  • markdown解析:flutter_markdown_plus^1.0.7
  • latex公式:flutter_markdown_plus_latex^1.0.5
  • 窗口管理:window_manager^0.5.1
  • 托盘管理:system_tray^2.0.3

p4-1.gif

p1.gif

功能特性

  1. Flutter3.41接入DeepSeek-V3,对话更丝滑
  2. 支持深度思考✨
  3. 支持latex数学公式✨
  4. 支持mermaid图表渲染✨
  5. 支持代码块横向滚动、代码高亮/复制代码✨
  6. 支持图片预览、链接跳转、表格✨
  7. 支持多轮上下文会话、本地存储对话✨

未标题-p4.png

项目结构目录

360截图20260414234213812.png

flutter3-deepseek-winai跨平台桌面ai系统已经同步到我的原创作品集。

flutter3.41+deepseek+dio客户端AI对话系统

未标题-p5.png

360截图20260414234213822.png

360截图20260414234256999.png

360截图20260414234706911.png

360截图20260414234706912.png

360截图20260414234801302.png

360截图20260414235005448.png

360截图20260414235005451.png

360截图20260414235033184.png

flutter create flutter_xxx 快速构建一个flutter3初始化项目。

 flutter run -d windows 命令快速运行到桌面端。

fe8e184115b07a432a16dcf82a3065e9_1289798-20260415104934281-464942867.png

flutter3配置.env文件

1509427bbec6d504976a23bcef8bc0b5_1289798-20260415105201455-30990895.png

通过flutter_dotenv插件配置环境变量。

需要自己申请deepseek apikey,替换项目根目录下.env文件里的key即可。

# 项目名称
APP_NAME = 'Flutter3-WinSeek'

# DeepSeek API配置
DEEPSEEK_API_KEY = apikey
DEEPSEEK_BASE_URL = https://api.deepseek.com

获取.env环境变量baseUrl和apiKey

String baseURL = dotenv.get('DEEPSEEK_BASE_URL');
String apiKEY = dotenv.get('DEEPSEEK_API_KEY');

项目入口main.dart

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:shirne_dialog/shirne_dialog.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:system_tray/system_tray.dart';
import 'package:window_manager/window_manager.dart';

import 'controller/app.dart';
import 'controller/chat.dart';

// 引入路由配置
import 'router/index.dart';

void main() async {
  // 初始化存储服务
  await GetStorage.init();

  // 将.env文件内容加载到dotenv中
  await dotenv.load(fileName: '.env');

  // 注册GetxController
  Get.put(AppStore());
  Get.put(ChatStore());

  // 初始化window_manager窗口
  WidgetsFlutterBinding.ensureInitialized();
  await windowManager.ensureInitialized();
  WindowOptions windowOptions = WindowOptions(
    size: Size(960, 640),
    center: true,
    backgroundColor: Colors.transparent,
    skipTaskbar: false,
    titleBarStyle: TitleBarStyle.hidden
  );
  windowManager.waitUntilReadyToShow(windowOptions, () async {
    windowManager.setAsFrameless();
    windowManager.setHasShadow(true);
    await windowManager.show();
    await windowManager.focus();
  });

  // 初始化托盘
  initSystemTray();

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    // 获取AppStore实例
    final appStore = AppStore.to;

    return GetMaterialApp(
      title: 'FLUTTER3 WINSEEK',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Color(0xFF7742F2)),
        useMaterial3: true,
        fontFamily: Platform.isWindows ? 'Microsoft YaHei' : null,
      ),
      // 初始路由
      initialRoute: appStore.isLogin ? '/' : '/login',
      // 路由页面
      getPages: routePages,
      // 初始弹窗key
      navigatorKey: MyDialog.navigatorKey,
      localizationsDelegates: [
        // Add your ShirneDialogLocalizations delegate here
        ShirneDialogLocalizations.delegate,
      ],
    );
  }
}

初始化创建系统托盘。

Future<void> initSystemTray() async {
  String trayIco = 'assets/images/tray.ico';
  SystemTray systemTray = SystemTray();

  // 初始化系统托盘
  await systemTray.initSystemTray(
    title: 'system-tray',
    iconPath: trayIco,
  );

  // 右键菜单
  final Menu menu = Menu();
  await menu.buildFrom([
    MenuItemLabel(label: '打开主界面', image: 'assets/images/tray.ico', onClicked: (menuItem) async => await windowManager.show()),
    MenuItemLabel(label: '隐藏窗口', image: 'assets/images/tray.ico', onClicked: (menuItem) async => await windowManager.hide()),
    MenuItemLabel(label: '设置中心', image: 'assets/images/tray.ico', onClicked: (menuItem) => Get.toNamed('/setting')),
    MenuItemLabel(label: '锁屏', image: 'assets/images/tray.ico', onClicked: (menuItem) => {}),
    MenuItemLabel(label: '关闭程序并退出', image: 'assets/images/tray.ico', onClicked: (menuItem) async => await windowManager.close()),
  ]);
  await systemTray.setContextMenu(menu);

  // 右键事件
  systemTray.registerSystemTrayEventHandler((eventName) async {
    debugPrint('eventName: $eventName');
    if (eventName == kSystemTrayEventClick) {
      Platform.isWindows ? await windowManager.show() : systemTray.popUpContextMenu();
    } else if (eventName == kSystemTrayEventRightClick) {
      Platform.isWindows ? systemTray.popUpContextMenu() : await windowManager.show();
    }
  });
}

360截图20260414235120230.png

360截图20260414235201167.png

360截图20260414235309110.png

360截图20260414235309112.png

360截图20260414235321832.png

360截图20260414235358409.png

360截图20260414235718152.png

360截图20260414235906479.png

360截图20260414235928046.png

360截图20260415000009877.png

360截图20260415000234556.png

项目布局模板

dc6b2d178bca57d98619f02dd67d7a52_1289798-20260415105844348-1496325433.png

项目布局结构分为,侧边收缩栏+右侧顶部自定义导航栏+ai对话区

c5cc27351db760099c50629209e61213_1289798-20260415105956389-696825072.png

return Scaffold(
  backgroundColor: Colors.grey[50],
  body: DragToResizeArea(
    child: Row(
      children: [
        // 侧边栏
        AnimatedSize(
          duration: const Duration(milliseconds: 300),
          curve: Curves.easeInOut,
          child: Container(
            width: collapsed ? 0 : 260,
            decoration: BoxDecoration(
              border: Border(right: BorderSide(color: Colors.grey.withAlpha(50)))
            ),
            child: Material(
              color: Color(0xFFF3F3F3),
              child: Sidebar(),
            ),
          ),
        ),
        // 主体容器
        Expanded(
          child: Column(
            children: [
              // 自定义导航栏
              SizedBox(
                height: 30.0,
                child: Row(
                  children: [
                    IconButton(
                      onPressed: () {
                        setState(() {
                          collapsed = !collapsed;
                        });
                      },
                      icon: Icon(collapsed ? Icons.format_indent_increase : Icons.format_indent_decrease, size: 16.0,),
                      tooltip: collapsed ? '展开' : '收缩',
                    ),
                    Expanded(
                      child: DragToMoveArea(
                        child: SizedBox(
                          height: double.infinity,
                        ),
                      ),
                    ),
                    // 右上角操作按钮
                    WinBtns(
                      leading: Row(
                        children: [
                          ...
                        ],
                      ),
                    ),
                  ],
                ),
              ),
              // 右侧主面板
              Expanded(
                child: Container(
                  child: widget.child,
                ),
              ),
            ],
          ),
        ),
      ],
    ),
  ),
);

flutter3-ai-editor编辑器

823e6c5f6fc01710f636a3158fcb2843_1289798-20260415110540911-1320179333.png

6068ffbcfb832fcf91433f7693d53f00_1289798-20260415110656558-114467072.png

612f3c723d3cf38ae6ec490a78481b5e_1289798-20260415110714267-1015673169.png

return Container(
  width: double.infinity,
  padding: EdgeInsets.symmetric(vertical: 10.0),
  child: Column(
    spacing: 6.0,
    children: [
      // 技能栏
      if (widget.skillbar)
      ScrollConfiguration(
        behavior: CustomScrollBehavior(),
        child: SingleChildScrollView(
          scrollDirection: Axis.horizontal,
          padding: EdgeInsets.symmetric(horizontal: 15.0),
          child: Row(
            spacing: 4.0,
            children: [
              ...
            ]
          ),
        ),
      ),
      // 编辑框
      Container(
        margin: EdgeInsets.symmetric(horizontal: 15.0),
        padding: EdgeInsets.all(10.0),
        decoration: BoxDecoration(
          color: Colors.white,
          border: Border.all(color: Colors.grey.withAlpha(100), width: .5),
          borderRadius: BorderRadius.circular(15.0),
          boxShadow: [
            BoxShadow(
              color: Colors.black.withAlpha(20),
              offset: Offset(0.0, 3.0),
              blurRadius: 6.0,
              spreadRadius: 0.0,
            ),
          ]
        ),
        child: Column(
          spacing: 10.0,
          children: [
            // 输入框
            ConstrainedBox(
              constraints: BoxConstraints(minHeight: 48.0, maxHeight: 150.0),
              child: TextField(
                ...
              ),
            ),
            // 操作栏
            Row(
              spacing: 10.0,
              children: [
                SizedBox(
                  height: 30.0,
                  child: TextButton(
                    onPressed: () {
                      // ...
                    },
                    style: ButtonStyle(
                      backgroundColor: WidgetStateProperty.all(isDeep ? Color(0xFF4F6BFE).withAlpha(30) : Colors.grey[200]),
                      padding: WidgetStateProperty.all(EdgeInsets.symmetric(horizontal: 10.0)),
                    ),
                    child: Row(
                      spacing: 4.0,
                      children: [
                        Icon(Icons.stream, color: isDeep ? Color(0xFF4F6BFE) : Colors.black, size: 18.0,),
                        Text('深度思考(R1)', style: TextStyle(color: isDeep ? Color(0xFF4F6BFE) : Colors.black, fontSize: 13.0),),
                      ],
                    ),
                  ),
                ),
                SizedBox(
                  height: 30.0,
                  child: TextButton(
                    onPressed: () {
                      // ...
                    },
                    style: ButtonStyle(
                      backgroundColor: WidgetStateProperty.all(isNetwork ? Color(0xFF4F6BFE).withAlpha(30) : Colors.grey[200]),
                      padding: WidgetStateProperty.all(EdgeInsets.symmetric(horizontal: 10.0)),
                    ),
                    child: Row(
                      spacing: 4.0,
                      children: [
                        Icon(Icons.travel_explore, color: isNetwork ? Color(0xFF4F6BFE) : Colors.black, size: 18.0,),
                        Text('联网', style: TextStyle(color: isNetwork ? Color(0xFF4F6BFE) : Colors.black, fontSize: 13.0),),
                      ],
                    ),
                  ),
                ),
                Spacer(),
                SizedBox(
                  height: 30.0,
                  width: 30.0,
                  child: IconButton(
                    ...
                  ),
                ),
                SizedBox(
                  height: 30.0,
                  width: 30.0,
                  child: IconButton(
                    ...
                  ),
                )
              ],
            ),
          ],
        ),
      ),
    ],
  )
);

未标题-p3.png

flutter3+dio实现流式打字输出

// 调用deepseek接口
final response = await dio.post(
  '$baseURL/v1/chat/completions',
  options: Options(
    // 响应超时
    receiveTimeout: const Duration(seconds: 60),
    headers: {
      "Content-Type": "application/json",
      "Authorization": "Bearer $apiKEY",
    },
    // 设置响应类型为流式响应
    responseType: ResponseType.stream,
  ),
  data: {
    // 多轮会话
    'messages': widget.multiConversation ? chatStore.historySession : [{'role': 'user', 'content': editorValue}],
    // deepseek-chat对话模型 deepseek-reasoner推理模型
    'model': chatStore.getSetting('thinkingEnabled') ? 'deepseek-reasoner' : 'deepseek-chat',
    'stream': true, // 流式输出
    'max_tokens': 8192, // 限制一次请求中模型生成 completion 的最大 token 数(默认使用 4096)
    'temperature': 0.4, // 严谨采样 越低越严谨(默认1)
  }
);

以上就是flutter3.41+deepseek实战桌面版ai对话系统的一些项目分享,感谢大家的阅读与支持!

爆肝flutter3.41+dart3.11+getx+dio仿写deepseek智能ai应用app

vite8.0-webai网页版AI模板|vue3+vite8+deepseek专属web版流式ai回答助手

2026实战uniapp+vue3+mphtml调用deepseek【小程序+安卓+H5】流式输出ai

Electron41 + Vite8 + Vue3.5实战打造你的专属AI回答助手

2026最新款Tauri2.10+Vite7.3+DeepSeek桌面版AI系统Exe

2026最新款Vite7+Vue3+DeepSeek-V3.2+Markdown移动端流式输出AI会话

基于electron38+vite7+vue3 setup+elementPlus电脑端仿微信/QQ聊天软件

electron38.2-vue3os系统|Vite7+Electron38+Pinia3+ArcoDesign桌面版OS后台管理

2025最新款Electron38+Vite7+Vue3+ElementPlus电脑端后台系统Exe

自研2025版flutter3.38实战抖音app短视频+聊天+直播商城系统

基于flutter3.32+window_manager仿macOS/Wins风格桌面os系统

flutter3.27+bitsdojo_window电脑端仿微信Exe应用

自研tauri2.0+vite6.x+vue3+rust+arco-design桌面版os管理系统Tauri2-ViteOS

基于uniapp+vue3+uvue短视频+聊天+直播app系统

基于uni-app+vue3+uvui跨三端仿微信app聊天模板【h5+小程序+app】