1 Commits
canary ... main

Author SHA1 Message Date
4682b0141f 第2次提交 2026-03-10 01:36:50 +08:00
33 changed files with 68 additions and 658 deletions

View File

@@ -1,3 +0,0 @@
{
"cmake.ignoreCMakeListsMissing": true
}

View File

@@ -1,52 +1,35 @@
项目名称MyDearest — Live2D AI 聊天(跨平台)
<<<<<<< HEAD
<<<<<<< HEAD
# mydearest
一、项目目标
- 使用 Live2DWeb 技术)作为 AI 形象,实现可交互的动画人物。
- 支持单聊与群聊即时通讯并可在手机Android/iOS与桌面Windows端良好运行。
- 对接大模型/LLM如 OpenAI/私有模型)实现智能对话、上下文记忆与多轮会话。
=======
<<<<<<< HEAD
# Flutter_First_Project
二、核心功能
1) Live2D 显示与互动:通过内嵌 WebView 渲染 Live2D 页面实现表情、动作、播报与点击交互Flutter 与 WebView 通过 JS Bridge 双向通信。
2) 聊天系统:消息列表、输入框、表情/图片/语音支持、群聊会话管理。
3) 实时通信:使用 WebSocket 做实时消息收发与 AI 流式响应(可选长连接用于多人在线场景)。
4) 本地存储:聊天历史、配置、用户信息本地缓存(使用 Hive 或 SharedPreferences
=======
=======
>>>>>>> b920871 (第2次提交)
# mydearest
三、技术选型
- 框架Flutter已包含 Android/iOS/Windows/web 支持)
- Live2D 渲染Web 技术pixi + live2d放在 `assets/web/`,通过 `webview_flutter` 加载JS Bridge 用于触发动作与接收模型事件。
- 即时通讯WebSocket`web_socket_channel`
- 网络请求:`dio`
- 聊天 UI`flutter_chat_ui` + `flutter_chat_types`
- 本地存储:`hive` / `hive_flutter`(可替代 `sqflite`
- 状态管理:`get`(快速),后期可替换为 `riverpod``bloc`
>>>>>>> f48a885 (第2次提交)
A new Flutter project.
四、里程碑(建议短迭代)
- M11 周):依赖与骨架搭建,完成 `pubspec.yaml` 引入;能在 Flutter 页面内加载本地 Live2D 测试 HTMLWebView
- M21 周):实现聊天 UI 基本框架(单聊),后端 WebSocket 回显服务(本地测试)。
- M31-2 周):接入 LLM API实现 AI 应答(含流式返回),并把 AI 输出与 Live2D 动作/表情联动。
- M42 周):完善群聊逻辑、消息持久化、离线/回溯、性能优化与多端适配Windows 特有处理)。
## Getting Started
五、初始开发步骤(从这里开始)
1) 运行依赖安装:在项目根目录执行:
This project is a starting point for a Flutter application.
```bash
flutter pub get
```
A few resources to get you started if this is your first Flutter project:
2) 创建 Live2D 测试页面(建议路径 `assets/web/live2d/index.html`),放入一个最小的 pixi + live2d 页面(可先用示例模型)。
3) 在 Flutter 中新建页面 `lib/pages/live2d_test.dart`,使用 `WebView` 加载上面的本地 HTML`WebView` 支持 file:// 或 asset 加载),并实现 JS 通信通道以便调用模型动作。
4) 验证 WebView 渲染:在 Android/iOS/Windows 端分别运行并确保模型可见且 JS 通信可用。
5) 创建聊天 UI 页面 `lib/pages/chat/chat_room.dart`,集成 `flutter_chat_ui` 的基本气泡、输入框与本地回显逻辑。
6) 启动一个简单的 WebSocket 回显服务(本地测试用,例如使用 Node.js 的 `ws`),并在 Flutter 端连接测试收发。
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
六、注意与风险点
- Live2D 原生 SDK 接入复杂度高,推荐先走 WebView 方案以快速验证体验并跨端复用。
- Windows 平台在 WebView 的文件加载与 JS 通信上可能与移动端存在差异,测试频繁验证。
- 如果选择使用商业 LLM如 OpenAI请注意 API Key 的安全管理与使用成本。
七、下一步我可以帮你的事(选择其一)
- A我现在把 `pubspec.yaml` 补齐依赖(我已完成)。
- B我可以生成 `lib/pages/live2d_test.dart` 的示例页面和 `assets/web/live2d/index.html` 的最小示例,并在本地引导你运行验证。
- C我可以搭建聊天 UI 基础页面并连接到一个本地 WebSocket 回显服务示例。
请选择你现在想先做的任务B 或 C我会继续实现下一步的代码与文件修改说明。
For help getting started with Flutter development, view the
[online documentation](https://docs.flutter.dev/), which offers tutorials,
samples, guidance on mobile development, and a full API reference.
<<<<<<< HEAD
<<<<<<< HEAD
=======
>>>>>>> 4bb705a (第一次提交)
>>>>>>> f48a885 (第2次提交)
=======
>>>>>>> b920871 (第2次提交)

View File

@@ -1,3 +0,0 @@
description: This file stores settings for Dart & Flutter DevTools.
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
extensions:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 607 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 302 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 276 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 298 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 598 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 663 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 302 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 225 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 515 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 415 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 327 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 423 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 451 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 566 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 395 B

View File

@@ -1,15 +0,0 @@
import 'package:flutter/material.dart';
import 'index.dart';
void main() => runApp(const MyChatTestApp());
class MyChatTestApp extends StatelessWidget {
const MyChatTestApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: const ChatPage(),
);
}
}

View File

@@ -1,44 +0,0 @@
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter_chat_core/flutter_chat_core.dart';
import 'package:flutter_chat_ui/flutter_chat_ui.dart';
class ChatPage extends StatefulWidget {
const ChatPage({super.key});
@override
State<ChatPage> createState() => _ChatPageState();
}
class _ChatPageState extends State<ChatPage> {
final _chatController = InMemoryChatController();
@override
void dispose() {
_chatController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Chat(
chatController: _chatController,
currentUserId: 'user1',
onMessageSend: (text) {
_chatController.insertMessage(
TextMessage(
// Better to use UUID or similar for the ID - IDs must be unique
id: '${Random().nextInt(1000) + 1}',
authorId: 'user1',
createdAt: DateTime.now().toUtc(),
text: text,
),
);
},
resolveUser: (UserID id) async {
return User(id: id, name: 'John Doe');
},
),
);
}
}

View File

@@ -1,17 +0,0 @@
import "package:flutter/material.dart";
class HomeView extends StatefulWidget {
const HomeView({super.key});
@override
State<HomeView> createState() => _HomeViewState();
}
class _HomeViewState extends State<HomeView> {
@override
Widget build(BuildContext context) {
return Center(
child: Text("Home View"),
);
}
}

View File

@@ -1,7 +1,4 @@
import "package:flutter/material.dart";
import '../home/index.dart';
import '../myfriends/index.dart';
import '../profile/index.dart';
class MainPage extends StatefulWidget {
const MainPage({super.key});
@@ -11,64 +8,14 @@ class MainPage extends StatefulWidget {
}
class _MainPageState extends State<MainPage> {
// 定义数据 根据数据进行渲染导航键
final List<Map<String, dynamic>> _navList = [
{
"icon": Icons.home_outlined,
"activeIcon": Icons.home,
"label": "Home",
},
{
"icon": Icons.face_outlined,
"activeIcon": Icons.face,
"label": "MyFriends",
},
{
"icon": Icons.person_outlined,
"activeIcon": Icons.person,
"label": "Profile",
},
];
// 根据数据渲染导航键
List<BottomNavigationBarItem> _buildNavItems() {
return List.generate(_navList.length, (int index) {
final navItem = _navList[index];
return BottomNavigationBarItem(
icon: Icon(navItem["icon"]),
activeIcon: Icon(navItem["activeIcon"]),
label: navItem["label"],
);
});
}
int _currentIndex = 0; // 当前选中的导航键索引
List<Widget> get _pages {
return [
const HomeView(),
const MyFriendsView(),
const ProfileView(),
]; // 对应导航键的页面列表
}
@override
Widget build(BuildContext context) {
return Scaffold(
// 避开刘海屏等特殊屏幕区域
body: SafeArea(child: IndexedStack(
index: _currentIndex,
children: _pages,
)), // 堆叠索引组件,根据当前索引显示对应的页面
bottomNavigationBar: BottomNavigationBar(
currentIndex: _currentIndex,
items: _buildNavItems(),
onTap: (int index) { // 点击导航键时更新当前索引
setState(() {
_currentIndex = index;
});
},
appBar: AppBar(
title: Text("Main Page"),
),
body: Center(
child: Text("This is the main page."),
),
);
}

View File

@@ -1,17 +0,0 @@
import 'package:flutter/material.dart';
class MyFriendsView extends StatefulWidget {
const MyFriendsView({super.key});
@override
State<MyFriendsView> createState() => _MyFriendsViewState();
}
class _MyFriendsViewState extends State<MyFriendsView> {
@override
Widget build(BuildContext context) {
return Center(
child: Text("MyFriends View"),
);
}
}

View File

@@ -1,17 +0,0 @@
import 'package:flutter/material.dart';
class ProfileView extends StatefulWidget {
const ProfileView({super.key});
@override
State<ProfileView> createState() => _ProfileViewState();
}
class _ProfileViewState extends State<ProfileView> {
@override
Widget build(BuildContext context) {
return Center(
child: Text("Profile View"),
);
}
}

View File

@@ -2,7 +2,6 @@
import 'package:flutter/material.dart';
import 'package:mydearest/pages/main/index.dart';
import 'package:mydearest/pages/login/index.dart';
import 'package:mydearest/pages/chat/index.dart';
// 返回APP根组件
Widget getRootWidget() {
@@ -17,7 +16,6 @@ Map<String, Widget Function(BuildContext)> getRootRoutes() {
return {
"/": (context) => MainPage(), // 主页路由
"/login": (context) => LoginPage(), // 登录页路由
"/chat": (context) => ChatPage(), // 聊天页路由
};
}

View File

@@ -5,12 +5,6 @@
import FlutterMacOS
import Foundation
import path_provider_foundation
import shared_preferences_foundation
import webview_flutter_wkwebview
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
WebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "WebViewFlutterPlugin"))
}

View File

@@ -6,7 +6,7 @@ packages:
description:
name: async
sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.13.0"
boolean_selector:
@@ -14,7 +14,7 @@ packages:
description:
name: boolean_selector
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.2"
characters:
@@ -22,7 +22,7 @@ packages:
description:
name: characters
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.4.0"
clock:
@@ -30,7 +30,7 @@ packages:
description:
name: clock
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.2"
collection:
@@ -38,116 +38,36 @@ packages:
description:
name: collection
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.19.1"
cross_cache:
dependency: transitive
description:
name: cross_cache
sha256: "4983a16603cc99b0a14de6a772fa8ee4533411f46f3c423f1386fea7566049c5"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
cross_file:
dependency: transitive
description:
name: cross_file
sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937"
url: "https://pub.dev"
source: hosted
version: "0.3.5+2"
crypto:
dependency: transitive
description:
name: crypto
sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf
url: "https://pub.dev"
source: hosted
version: "3.0.7"
cupertino_icons:
dependency: "direct main"
description:
name: cupertino_icons
sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.8"
diffutil_dart:
dependency: transitive
description:
name: diffutil_dart
sha256: "5e74883aedf87f3b703cb85e815bdc1ed9208b33501556e4a8a5572af9845c81"
url: "https://pub.dev"
source: hosted
version: "4.0.1"
dio:
dependency: "direct main"
description:
name: dio
sha256: aff32c08f92787a557dd5c0145ac91536481831a01b4648136373cddb0e64f8c
url: "https://pub.dev"
source: hosted
version: "5.9.2"
dio_web_adapter:
dependency: transitive
description:
name: dio_web_adapter
sha256: "2f9e64323a7c3c7ef69567d5c800424a11f8337b8b228bad02524c9fb3c1f340"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
fake_async:
dependency: transitive
description:
name: fake_async
sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.3"
ffi:
dependency: transitive
description:
name: ffi
sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45"
url: "https://pub.dev"
source: hosted
version: "2.2.0"
file:
dependency: transitive
description:
name: file
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
url: "https://pub.dev"
source: hosted
version: "7.0.1"
flutter:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_chat_core:
dependency: "direct main"
description:
name: flutter_chat_core
sha256: "8c46790f64f106bf6e610e2a7324b3844320e9e295867c06d45d9deb134d848d"
url: "https://pub.dev"
source: hosted
version: "2.9.0"
flutter_chat_ui:
dependency: "direct main"
description:
name: flutter_chat_ui
sha256: cfbaac38f429beb33d9cc1ca920ae7ccbadbed282c99335d590d61306d3a3d0f
url: "https://pub.dev"
source: hosted
version: "2.11.1"
flutter_lints:
dependency: "direct dev"
description:
name: flutter_lints
sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.0.0"
flutter_test:
@@ -155,81 +75,12 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
freezed_annotation:
dependency: transitive
description:
name: freezed_annotation
sha256: "7294967ff0a6d98638e7acb774aac3af2550777accd8149c90af5b014e6d44d8"
url: "https://pub.dev"
source: hosted
version: "3.1.0"
get:
dependency: "direct main"
description:
name: get
sha256: "5ed34a7925b85336e15d472cc4cfe7d9ebf4ab8e8b9f688585bf6b50f4c3d79a"
url: "https://pub.dev"
source: hosted
version: "4.7.3"
hive:
dependency: "direct main"
description:
name: hive
sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941"
url: "https://pub.dev"
source: hosted
version: "2.2.3"
hive_flutter:
dependency: "direct main"
description:
name: hive_flutter
sha256: dca1da446b1d808a51689fb5d0c6c9510c0a2ba01e22805d492c73b68e33eecc
url: "https://pub.dev"
source: hosted
version: "1.1.0"
http_parser:
dependency: transitive
description:
name: http_parser
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
url: "https://pub.dev"
source: hosted
version: "4.1.2"
idb_shim:
dependency: transitive
description:
name: idb_shim
sha256: "071f3b05032fa62e60ca15db9939f8afbaf403b37e67747ac88f858c3e999228"
url: "https://pub.dev"
source: hosted
version: "2.6.7+1"
intl:
dependency: transitive
description:
name: intl
sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5"
url: "https://pub.dev"
source: hosted
version: "0.20.2"
json_annotation:
dependency: transitive
description:
name: json_annotation
sha256: cb09e7dac6210041fad964ed7fbee004f14258b4eca4040f72d1234062ace4c8
url: "https://pub.dev"
source: hosted
version: "4.11.0"
leak_tracker:
dependency: transitive
description:
name: leak_tracker
sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "11.0.2"
leak_tracker_flutter_testing:
@@ -237,7 +88,7 @@ packages:
description:
name: leak_tracker_flutter_testing
sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.10"
leak_tracker_testing:
@@ -245,7 +96,7 @@ packages:
description:
name: leak_tracker_testing
sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.2"
lints:
@@ -253,7 +104,7 @@ packages:
description:
name: lints
sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.1.1"
matcher:
@@ -261,7 +112,7 @@ packages:
description:
name: matcher
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.12.17"
material_color_utilities:
@@ -269,7 +120,7 @@ packages:
description:
name: material_color_utilities
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.11.1"
meta:
@@ -277,177 +128,17 @@ packages:
description:
name: meta
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.16.0"
mime:
dependency: transitive
description:
name: mime
sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6"
url: "https://pub.dev"
source: hosted
version: "2.0.0"
nested:
dependency: transitive
description:
name: nested
sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
path:
dependency: transitive
description:
name: path
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.9.1"
path_provider:
dependency: "direct main"
description:
name: path_provider
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
url: "https://pub.dev"
source: hosted
version: "2.1.5"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
sha256: f2c65e21139ce2c3dad46922be8272bb5963516045659e71bb16e151c93b580e
url: "https://pub.dev"
source: hosted
version: "2.2.22"
path_provider_foundation:
dependency: transitive
description:
name: path_provider_foundation
sha256: "6d13aece7b3f5c5a9731eaf553ff9dcbc2eff41087fd2df587fd0fed9a3eb0c4"
url: "https://pub.dev"
source: hosted
version: "2.5.1"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
url: "https://pub.dev"
source: hosted
version: "2.2.1"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
url: "https://pub.dev"
source: hosted
version: "2.3.0"
platform:
dependency: transitive
description:
name: platform
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
url: "https://pub.dev"
source: hosted
version: "3.1.6"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.dev"
source: hosted
version: "2.1.8"
provider:
dependency: transitive
description:
name: provider
sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272"
url: "https://pub.dev"
source: hosted
version: "6.1.5+1"
scrollview_observer:
dependency: transitive
description:
name: scrollview_observer
sha256: "6e40ced415145c449a691d892157a3b854b751f024aed20d9aebda04c21444a3"
url: "https://pub.dev"
source: hosted
version: "1.26.3"
sembast:
dependency: transitive
description:
name: sembast
sha256: c8063c3146c3c8d5f5b04230de7682c768440a575fbda2634f14d22f263197c3
url: "https://pub.dev"
source: hosted
version: "3.8.5+2"
shared_preferences:
dependency: "direct main"
description:
name: shared_preferences
sha256: "2939ae520c9024cb197fc20dee269cd8cdbf564c8b5746374ec6cacdc5169e64"
url: "https://pub.dev"
source: hosted
version: "2.5.4"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
sha256: "8374d6200ab33ac99031a852eba4c8eb2170c4bf20778b3e2c9eccb45384fb41"
url: "https://pub.dev"
source: hosted
version: "2.4.21"
shared_preferences_foundation:
dependency: transitive
description:
name: shared_preferences_foundation
sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f"
url: "https://pub.dev"
source: hosted
version: "2.5.6"
shared_preferences_linux:
dependency: transitive
description:
name: shared_preferences_linux
sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
shared_preferences_platform_interface:
dependency: transitive
description:
name: shared_preferences_platform_interface
sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
shared_preferences_web:
dependency: transitive
description:
name: shared_preferences_web
sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019
url: "https://pub.dev"
source: hosted
version: "2.4.3"
shared_preferences_windows:
dependency: transitive
description:
name: shared_preferences_windows
sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
sky_engine:
dependency: transitive
description: flutter
@@ -458,7 +149,7 @@ packages:
description:
name: source_span
sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.10.2"
stack_trace:
@@ -466,7 +157,7 @@ packages:
description:
name: stack_trace
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.12.1"
stream_channel:
@@ -474,7 +165,7 @@ packages:
description:
name: stream_channel
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.4"
string_scanner:
@@ -482,23 +173,15 @@ packages:
description:
name: string_scanner
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.4.1"
synchronized:
dependency: transitive
description:
name: synchronized
sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0
url: "https://pub.dev"
source: hosted
version: "3.4.0"
term_glyph:
dependency: transitive
description:
name: term_glyph
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.2"
test_api:
@@ -506,23 +189,15 @@ packages:
description:
name: test_api
sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.7.6"
typed_data:
dependency: transitive
description:
name: typed_data
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
url: "https://pub.dev"
source: hosted
version: "1.4.0"
vector_math:
dependency: transitive
description:
name: vector_math
sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.0"
vm_service:
@@ -530,65 +205,9 @@ packages:
description:
name: vm_service
sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60"
url: "https://pub.dev"
url: "https://pub.flutter-io.cn"
source: hosted
version: "15.0.2"
web:
dependency: transitive
description:
name: web
sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
url: "https://pub.dev"
source: hosted
version: "1.1.1"
web_socket_channel:
dependency: "direct main"
description:
name: web_socket_channel
sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b
url: "https://pub.dev"
source: hosted
version: "2.4.0"
webview_flutter:
dependency: "direct main"
description:
name: webview_flutter
sha256: a3da219916aba44947d3a5478b1927876a09781174b5a2b67fa5be0555154bf9
url: "https://pub.dev"
source: hosted
version: "4.13.1"
webview_flutter_android:
dependency: transitive
description:
name: webview_flutter_android
sha256: "2a03df01df2fd30b075d1e7f24c28aee593f2e5d5ac4c3c4283c5eda63717b24"
url: "https://pub.dev"
source: hosted
version: "4.10.13"
webview_flutter_platform_interface:
dependency: transitive
description:
name: webview_flutter_platform_interface
sha256: "63d26ee3aca7256a83ccb576a50272edd7cfc80573a4305caa98985feb493ee0"
url: "https://pub.dev"
source: hosted
version: "2.14.0"
webview_flutter_wkwebview:
dependency: transitive
description:
name: webview_flutter_wkwebview
sha256: fc0af89d403e1c053f03d023d97550412fa79f35332e2939514c82e6fe633198
url: "https://pub.dev"
source: hosted
version: "3.23.8"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
sdks:
dart: ">=3.9.2 <4.0.0"
flutter: ">=3.35.0"
flutter: ">=3.18.0-18.0.pre.54"

View File

@@ -1,5 +1,5 @@
name: mydearest
description: "A Live2D AI chat app (multi-platform Flutter project)."
description: "A new Flutter project."
# The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
@@ -31,30 +31,19 @@ dependencies:
flutter:
sdk: flutter
# UI / state
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.8
get: ^4.7.3
# Networking
dio: ^5.2.0
web_socket_channel: ^2.3.0
# Chat UI
flutter_chat_core: ^2.9.0
flutter_chat_ui: ^2.11.1
# Live2D via WebView
webview_flutter: ^4.0.7
# Local storage
hive: ^2.2.3
hive_flutter: ^1.1.0
path_provider: ^2.0.15
shared_preferences: ^2.1.1
dev_dependencies:
flutter_test:
sdk: flutter
# The "flutter_lints" package below contains a set of recommended lints to
# encourage good coding practices. The lint set provided by the package is
# activated in the `analysis_options.yaml` file located at the root of your
# package. See that file for information about deactivating specific lint
# rules and activating additional ones.
flutter_lints: ^5.0.0
# For information on the generic Dart part of this file, see the
@@ -72,11 +61,6 @@ flutter:
# assets:
# - images/a_dot_burr.jpeg
# - images/a_dot_ham.jpeg
assets:
- lib/assets/images/
- lib/assets/icons/
- assets/web/
- assets/live2d/
# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/to/resolution-aware-images

View File

@@ -8,11 +8,12 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mydearest/main.dart';
void main() {
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(const MyApp());
// Verify that our counter starts at 0.
expect(find.text('0'), findsOneWidget);