From 86d9daf90a24a9c45f89e69635dfda00208e8ef2 Mon Sep 17 00:00:00 2001 From: "Ding, Shuo" Date: Wed, 18 Jun 2025 11:28:37 +0800 Subject: [PATCH] 1 --- .gitignore | 45 ++ .metadata | 30 ++ README.md | 16 + analysis_options.yaml | 28 ++ android/.gitignore | 14 + android/app/build.gradle.kts | 44 ++ android/app/src/debug/AndroidManifest.xml | 7 + android/app/src/main/AndroidManifest.xml | 45 ++ .../java/com/example/app003/MainActivity.java | 6 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 18 + android/app/src/main/res/values/styles.xml | 18 + android/app/src/profile/AndroidManifest.xml | 12 + android/build.gradle.kts | 25 + android/gradle.properties | 5 + .../gradle/wrapper/gradle-wrapper.properties | 5 + android/settings.gradle.kts | 25 + assets/images/avatar.png | Bin 0 -> 82033 bytes lib/app.dart | 18 + lib/config/theme.dart | 23 + lib/main.dart | 6 + lib/models/chat_message.dart | 11 + lib/screens/chat_screen.dart | 180 ++++++++ lib/widgets/ai_avatar.dart | 24 + lib/widgets/chat_bubble.dart | 32 ++ lib/widgets/chat_input.dart | 351 ++++++++++++++ lib/widgets/gradient_background.dart | 25 + pubspec.lock | 434 ++++++++++++++++++ pubspec.yaml | 95 ++++ 35 files changed, 1566 insertions(+) create mode 100644 .gitignore create mode 100644 .metadata create mode 100644 README.md create mode 100644 analysis_options.yaml create mode 100644 android/.gitignore create mode 100644 android/app/build.gradle.kts create mode 100644 android/app/src/debug/AndroidManifest.xml create mode 100644 android/app/src/main/AndroidManifest.xml create mode 100644 android/app/src/main/java/com/example/app003/MainActivity.java create mode 100644 android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 android/app/src/main/res/drawable/launch_background.xml create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/values-night/styles.xml create mode 100644 android/app/src/main/res/values/styles.xml create mode 100644 android/app/src/profile/AndroidManifest.xml create mode 100644 android/build.gradle.kts create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100644 android/settings.gradle.kts create mode 100644 assets/images/avatar.png create mode 100644 lib/app.dart create mode 100644 lib/config/theme.dart create mode 100644 lib/main.dart create mode 100644 lib/models/chat_message.dart create mode 100644 lib/screens/chat_screen.dart create mode 100644 lib/widgets/ai_avatar.dart create mode 100644 lib/widgets/chat_bubble.dart create mode 100644 lib/widgets/chat_input.dart create mode 100644 lib/widgets/gradient_background.dart create mode 100644 pubspec.lock create mode 100644 pubspec.yaml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..79c113f --- /dev/null +++ b/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..9c60152 --- /dev/null +++ b/.metadata @@ -0,0 +1,30 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "6fba2447e95c451518584c35e25f5433f14d888c" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 6fba2447e95c451518584c35e25f5433f14d888c + base_revision: 6fba2447e95c451518584c35e25f5433f14d888c + - platform: android + create_revision: 6fba2447e95c451518584c35e25f5433f14d888c + base_revision: 6fba2447e95c451518584c35e25f5433f14d888c + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/README.md b/README.md new file mode 100644 index 0000000..8344389 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# app003 + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +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. diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..0d29021 --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..be3943c --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,14 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java +.cxx/ + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts new file mode 100644 index 0000000..9f11899 --- /dev/null +++ b/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.app003" + compileSdk = flutter.compileSdkVersion + ndkVersion = "29.0.13599879" + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.app003" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = 24 + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..83953f6 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/java/com/example/app003/MainActivity.java b/android/app/src/main/java/com/example/app003/MainActivity.java new file mode 100644 index 0000000..d963074 --- /dev/null +++ b/android/app/src/main/java/com/example/app003/MainActivity.java @@ -0,0 +1,6 @@ +package com.example.app003; + +import io.flutter.embedding.android.FlutterActivity; + +public class MainActivity extends FlutterActivity { +} diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..06952be --- /dev/null +++ b/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..cb1ef88 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..c872ab8 --- /dev/null +++ b/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/android/build.gradle.kts b/android/build.gradle.kts new file mode 100644 index 0000000..b17e8f3 --- /dev/null +++ b/android/build.gradle.kts @@ -0,0 +1,25 @@ +allprojects { + repositories { + google() + mavenCentral() + maven { url = uri("https://maven.aliyun.com/repository/public/") } + maven { url = uri("https://maven.aliyun.com/repository/google/") } + maven { url = uri("https://maven.aliyun.com/repository/gradle-plugin/") } + + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..8bf6f1f --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,5 @@ +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +android.enableJetifier=true +systemProp.https.proxyHost=127.0.0.1 +systemProp.https.proxyPort=7890 \ No newline at end of file diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..6701377 --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://mirrors.aliyun.com/macports/distfiles/gradle/gradle-8.12-all.zip diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts new file mode 100644 index 0000000..ab39a10 --- /dev/null +++ b/android/settings.gradle.kts @@ -0,0 +1,25 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.7.3" apply false + id("org.jetbrains.kotlin.android") version "2.1.0" apply false +} + +include(":app") diff --git a/assets/images/avatar.png b/assets/images/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..f708034088862a9620841222b3c980c5c980ae62 GIT binary patch literal 82033 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

VnMnuOVoXttnB)TnS)bI77?geX#(Qk0yQFnX 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 createState() => _ChatScreenState(); +} + +class _ChatScreenState extends State { + final List _messages = []; + int? _currentStreamingMessageIndex; + int _lastUserMessageCount = 0; // 添加这个变量跟踪用户消息数量 + + void _handleSendMessage(String text) { + if (text.trim().isEmpty) return; + setState(() { + _messages.add(ChatMessage( + text: text, + isUser: true, + timestamp: DateTime.now(), + )); + _lastUserMessageCount = _getUserMessageCount(); // 更新用户消息计数 + _currentStreamingMessageIndex = null; // 重置流索引,强制创建新气泡 + }); + } + + // 处理语音识别后的文本 + void _handleAIResponse(String text) { + setState(() { + _messages.add(ChatMessage( + text: text, + isUser: true, // 用户的消息 + timestamp: DateTime.now(), + )); + _lastUserMessageCount = _getUserMessageCount(); // 更新用户消息计数 + _currentStreamingMessageIndex = null; // 重置流索引,强制创建新气泡 + }); + } + + // 计算用户消息总数 + int _getUserMessageCount() { + return _messages.where((msg) => msg.isUser).length; + } + + // 处理 AI 流式响应 + void _handleAIStreamResponse(String text, bool isComplete) { + // 检查是否有新的用户消息,如果有,应该创建新的AI响应 + final currentUserMessageCount = _getUserMessageCount(); + final hasNewUserMessage = currentUserMessageCount > _lastUserMessageCount; + + setState(() { + if (hasNewUserMessage || _currentStreamingMessageIndex == null) { + // 有新用户消息或首次响应,创建新气泡 + _messages.add(ChatMessage( + text: text, + isUser: false, + timestamp: DateTime.now(), + )); + _currentStreamingMessageIndex = _messages.length - 1; + _lastUserMessageCount = currentUserMessageCount; // 更新追踪 + } else { + // 更新现有气泡 + if (_currentStreamingMessageIndex! < _messages.length) { + _messages[_currentStreamingMessageIndex!] = ChatMessage( + text: text, + isUser: false, + timestamp: _messages[_currentStreamingMessageIndex!].timestamp, + ); + } + } + + // 如果完成了,重置索引 + if (isComplete) { + _currentStreamingMessageIndex = null; + } + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: GradientBackground( + child: SafeArea( + child: Column( + children: [ + // Header with AI avatar + SizedBox( + height: 140, + child: Stack( + children: [ + // 背景渐变已由外层GradientBackground提供 + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // AI贴图 + const Padding( + padding: EdgeInsets.only(left: 16, top: 0), + child: AIAvatar(width: 120, height: 140), + ), + const SizedBox(width: 8), + // 文字整体下移 + Padding( + padding: const EdgeInsets.only(top: 48), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Hi, 我是众众!', + style: TextStyle( + fontSize: 22, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + const SizedBox(height: 8), + Text( + '您的专属看、选、买、用车助手', + style: TextStyle( + fontSize: 14, + color: Colors.white.withOpacity(0.8), + ), + ), + ], + ), + ), + // 可选:右上角关闭按钮 + const Spacer(), + Padding( + padding: const EdgeInsets.only(top: 16, right: 16), + child: Icon(Icons.close, color: Colors.white), + ), + ], + ), + // 底部分割线 + Positioned( + left: 0, + right: 0, + bottom: 0, + child: Container( + height: 1, + color: Colors.white.withOpacity(0.15), + ), + ), + ], + ), + ), + + // Chat messages + Expanded( + child: ListView.builder( + padding: const EdgeInsets.symmetric(horizontal: 16), + itemCount: _messages.length, + reverse: true, + itemBuilder: (context, index) { + final message = _messages[_messages.length - 1 - index]; + return ChatBubble(message: message); + }, + ), + ), + + // Input area + ChatInput( + onSendMessage: _handleSendMessage, + onAIResponse: _handleAIResponse, + onAIStreamResponse: _handleAIStreamResponse, // 添加新回调 + ), + ], + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/widgets/ai_avatar.dart b/lib/widgets/ai_avatar.dart new file mode 100644 index 0000000..a2c0b8f --- /dev/null +++ b/lib/widgets/ai_avatar.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; + +class AIAvatar extends StatelessWidget { + final double width; + final double height; + + const AIAvatar({ + super.key, + this.width = 120, + this.height = 140, + }); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: width, + height: height, + child: Image.asset( + 'assets/images/avatar.png', + fit: BoxFit.contain, + ), + ); + } +} \ No newline at end of file diff --git a/lib/widgets/chat_bubble.dart b/lib/widgets/chat_bubble.dart new file mode 100644 index 0000000..8a1ef08 --- /dev/null +++ b/lib/widgets/chat_bubble.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +import '../models/chat_message.dart'; + +class ChatBubble extends StatelessWidget { + final ChatMessage message; + + const ChatBubble({super.key, required this.message}); + + @override + Widget build(BuildContext context) { + return Align( + alignment: message.isUser ? Alignment.centerRight : Alignment.centerLeft, + child: Container( + margin: const EdgeInsets.symmetric(vertical: 8), + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + decoration: BoxDecoration( + color: message.isUser + ? const Color(0xFF6C63FF) + : Colors.white.withOpacity(0.1), + borderRadius: BorderRadius.circular(16), + ), + child: Text( + message.text, + style: TextStyle( + color: message.isUser ? Colors.white : Colors.white, + fontSize: 16, + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/widgets/chat_input.dart b/lib/widgets/chat_input.dart new file mode 100644 index 0000000..ad6f0f4 --- /dev/null +++ b/lib/widgets/chat_input.dart @@ -0,0 +1,351 @@ +import 'dart:async'; +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:record/record.dart'; +import 'package:http/http.dart' as http; +import 'package:http_parser/http_parser.dart'; +import 'dart:typed_data'; +import 'dart:convert'; +import 'package:path_provider/path_provider.dart'; +import 'dart:math'; + +class ChatInput extends StatefulWidget { + final Function(String) onSendMessage; + final Function(String) onAIResponse; + // 新增一个回调,用于处理 AI 流式回复 + final Function(String, bool) onAIStreamResponse; + + const ChatInput({ + super.key, + required this.onSendMessage, + required this.onAIResponse, + required this.onAIStreamResponse, // 添加这个参数 + }); + + @override + State createState() => _ChatInputState(); +} + +class _ChatInputState extends State { + final TextEditingController _controller = TextEditingController(); + final AudioRecorder _recorder = AudioRecorder(); + List _audioBuffer = []; + String? _tempFilePath; + bool _isRecording = false; + + // 添加静态变量存储用户ID和会话ID + static String? _cachedUserId; + static String? _cachedConversationId; + + @override + void initState() { + super.initState(); + _checkPermission(); + } + + Future _checkPermission() async { + final hasPermission = await _recorder.hasPermission(); + print('麦克风权限状态: $hasPermission'); + } + + @override + void dispose() { + _controller.dispose(); + _recorder.dispose(); + super.dispose(); + } + + void _handleSubmit() { + final text = _controller.text; + if (text.trim().isNotEmpty) { + widget.onSendMessage(text); + _controller.clear(); + } + } + + Future _startRecording() async { + setState(() { + _isRecording = true; + _audioBuffer = []; + }); + + print('开始录音...'); + + try { + // 使用文件录音可能更稳定 + final tempDir = await getTemporaryDirectory(); + _tempFilePath = '${tempDir.path}/temp_audio_${DateTime.now().millisecondsSinceEpoch}.opus'; + + print('录音文件路径: $_tempFilePath'); + + if (await _recorder.hasPermission()) { + + await _recorder.start( + RecordConfig(encoder: AudioEncoder.opus), + path: _tempFilePath!, + ); + + print('录音已开始,使用OPUS格式,文件: $_tempFilePath'); + } else { + print('没有麦克风权限,无法开始录音'); + } + } catch (e) { + print('录音开始出错: $e'); + setState(() { + _isRecording = false; + }); + } + } + + Future _stopAndSendRecording() async { + if (!_isRecording) return; + + setState(() { + _isRecording = false; + }); + + print('停止录音...'); + try { + final path = await _recorder.stop(); + print('录音已停止,文件路径: $path'); + + if (path != null) { + final file = File(path); + if (await file.exists()) { + final bytes = await file.readAsBytes(); + print('读取到录音数据: ${bytes.length} 字节'); + + if (bytes.isNotEmpty) { + // 第一步: 发送音频到语音识别接口 + final recognizedText = await _sendAudioToServer(bytes); + if (recognizedText != null) { + // 把识别的文本作为用户消息展示 + widget.onAIResponse(recognizedText); + + // 第二步: 将识别的文本发送到 Chat SSE 接口 + _sendTextToChatSSE(recognizedText); + } + } else { + print('录音数据为空'); + } + } else { + print('录音文件不存在: $path'); + } + } else { + print('录音路径为空'); + } + } catch (e) { + print('停止录音或发送过程出错: $e'); + } + } + + // 修改返回类型,以便获取识别的文本 + Future _sendAudioToServer(List audioBytes) async { + try { + print('准备发送OPUS音频数据,大小: ${audioBytes.length} 字节'); + final uri = Uri.parse('http://143.64.185.20:18606/voice'); + print('发送到: $uri'); + + final request = http.MultipartRequest('POST', uri); + request.files.add( + http.MultipartFile.fromBytes( + 'audio', + audioBytes, + filename: 'record.wav', + contentType: MediaType('audio', 'wav'), + ), + ); + request.fields['lang'] = 'cn'; + + print('发送请求...'); + final streamResponse = await request.send(); + print('收到响应,状态码: ${streamResponse.statusCode}'); + + final response = await http.Response.fromStream(streamResponse); + + if (response.statusCode == 200) { + print('响应内容: ${response.body}'); + final text = _parseTextFromJson(response.body); + if (text != null) { + print('解析出文本: $text'); + return text; // 返回识别的文本 + } else { + print('解析文本失败'); + } + } else { + print('请求失败,状态码: ${response.statusCode},响应: ${response.body}'); + } + } catch (e) { + print('发送录音到服务器时出错: $e'); + } + return null; + } + + // 添加这个方法,用于从JSON响应中解析文本 + String? _parseTextFromJson(String body) { + try { + final decoded = jsonDecode(body); + if (decoded.containsKey('text')) { + return decoded['text'] as String?; + } + return null; + } catch (e) { + print('JSON解析错误: $e, 原始数据: $body'); + return null; + } + } + + // 新增方法:发送文本到 Chat SSE 接口 + void _sendTextToChatSSE(String text) async { + print('将识别的文本发送到 Chat SSE 接口: $text'); + + // 如果用户ID未初始化,则生成一个 + if (_cachedUserId == null) { + _cachedUserId = _generateRandomUserId(6); // 生成6位随机ID + print('初始化用户ID: $_cachedUserId'); + } + + try { + // 使用 HttpClient 来处理 SSE + final client = HttpClient(); + // 设置 URL 和参数 + final chatUri = Uri.parse('http://143.64.185.20:18606/chat'); + final request = await client.postUrl(chatUri); + + // 设置请求头 + request.headers.set('Content-Type', 'application/json'); + request.headers.set('Accept', 'text/event-stream'); + + // 设置请求体 + final body = { + 'message': text, + 'user': _cachedUserId, + }; + + // 如果有缓存的会话ID,则添加到请求体 + if (_cachedConversationId != null) { + body['conversation_id'] = _cachedConversationId; + print('使用缓存的会话ID: $_cachedConversationId'); + } else { + print('首次请求,不使用会话ID'); + } + + request.add(utf8.encode(json.encode(body))); + + // 发送请求并获取 SSE 流 + final response = await request.close(); + + if (response.statusCode == 200) { + print('SSE 连接成功,开始接收流数据'); + + // 创建一个变量保存累积的 AI 回复 + String accumulatedResponse = ''; + + // 使用 transform 将流数据转换为字符串 + await for (final data in response.transform(utf8.decoder)) { + // 处理 SSE 数据(格式为 "data: {...}\n\n") + final lines = data.split('\n'); + + for (var line in lines) { + if (line.startsWith('data:')) { + // 提取 JSON 数据部分 + final jsonStr = line.substring(5).trim(); + + if (jsonStr == '[DONE]') { + // 流结束 + print('SSE 流结束'); + // 发送最终完整的回复,标记为完成 + widget.onAIStreamResponse(accumulatedResponse, true); + break; + } + + try { + final jsonData = json.decode(jsonStr); + + // 尝试提取会话ID (如果存在) + if (jsonData.containsKey('conversation_id') && _cachedConversationId == null) { + _cachedConversationId = jsonData['conversation_id']; + print('从响应中提取并缓存会话ID: $_cachedConversationId'); + } + + // 提取并累加内容片段 + if(jsonData['event'].toString().contains('message')){ + // 代表是有实际消息的数据 + final textChunk = jsonData.containsKey('answer') ? + jsonData['answer'] : ''; + accumulatedResponse += textChunk; + widget.onAIStreamResponse(accumulatedResponse, false); + } + } catch (e) { + print('解析 SSE 数据出错: $e, 原始数据: $jsonStr'); + } + } + } + } + } else { + print('SSE 连接失败,状态码: ${response.statusCode}'); + } + } catch (e) { + print('SSE 连接出错: $e'); + } + } + + // 生成随机用户ID的辅助方法 + String _generateRandomUserId(int length) { + const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + final random = Random(); + return String.fromCharCodes( + Iterable.generate(length, (_) => chars.codeUnitAt(random.nextInt(chars.length))) + ); + } + + // 添加一个新方法来呼出键盘 + void _showKeyboard() { + FocusScope.of(context).requestFocus(FocusNode()); + // 给输入框焦点,触发键盘弹出 + Future.delayed(const Duration(milliseconds: 50), () { + FocusScope.of(context).requestFocus( + FocusNode()..requestFocus() + ); + }); + } + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(8.0), + color: Colors.transparent, + child: Row( + children: [ + Expanded( + child: GestureDetector( + onLongPress: _startRecording, + onLongPressUp: _stopAndSendRecording, + child: AnimatedContainer( + duration: const Duration(milliseconds: 150), + height: 48, + alignment: Alignment.center, + decoration: BoxDecoration( + color: _isRecording + ? Colors.white.withOpacity(0.25) + : Colors.white.withOpacity(0.1), + borderRadius: BorderRadius.circular(24), + ), + child: Text( + _isRecording ? '正在说话中...' : '按住说话', + style: const TextStyle(color: Colors.white70, fontSize: 16), + ), + ), + ), + ), + IconButton( + // 替换为键盘图标 + icon: const Icon(Icons.keyboard, color: Colors.white), + // 修改点击行为为呼出键盘 + onPressed: _showKeyboard, + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/widgets/gradient_background.dart b/lib/widgets/gradient_background.dart new file mode 100644 index 0000000..00fbdda --- /dev/null +++ b/lib/widgets/gradient_background.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +class GradientBackground extends StatelessWidget { + final Widget child; + + const GradientBackground({super.key, required this.child}); + + @override + Widget build(BuildContext context) { + return Container( + decoration: const BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0xFF451663), + Color(0xFF17042B), + Color(0xFF0B021D), + ], + ), + ), + child: child, + ); + } +} \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..0dc1dbd --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,434 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" + source: hosted + version: "2.13.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + url: "https://pub.dev" + source: hosted + version: "5.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + fluttertoast: + dependency: "direct main" + description: + name: fluttertoast + sha256: "25e51620424d92d3db3832464774a6143b5053f15e382d8ffbfd40b6e795dcf1" + url: "https://pub.dev" + source: hosted + version: "8.2.12" + http: + dependency: "direct main" + description: + name: http + sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" + url: "https://pub.dev" + source: hosted + version: "1.4.0" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" + url: "https://pub.dev" + source: hosted + version: "10.0.9" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + url: "https://pub.dev" + source: hosted + version: "3.0.9" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + url: "https://pub.dev" + source: hosted + version: "5.1.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" + source: hosted + version: "0.12.17" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.dev" + source: hosted + version: "1.16.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + 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: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 + url: "https://pub.dev" + source: hosted + version: "2.2.17" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" + url: "https://pub.dev" + source: hosted + version: "2.4.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" + record: + dependency: "direct main" + description: + name: record + sha256: daeb3f9b3fea9797094433fe6e49a879d8e4ca4207740bc6dc7e4a58764f0817 + url: "https://pub.dev" + source: hosted + version: "6.0.0" + record_android: + dependency: transitive + description: + name: record_android + sha256: "97d7122455f30de89a01c6c244c839085be6b12abca251fc0e78f67fed73628b" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + record_ios: + dependency: transitive + description: + name: record_ios + sha256: "73706ebbece6150654c9d6f57897cf9b622c581148304132ba85dba15df0fdfb" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + record_linux: + dependency: transitive + description: + name: record_linux + sha256: "29e7735b05c1944bb6c9b72a36c08d4a1b24117e712d6a9523c003bde12bf484" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + record_macos: + dependency: transitive + description: + name: record_macos + sha256: "02240833fde16c33fcf2c589f3e08d4394b704761b4a3bb609d872ff3043fbbd" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + record_platform_interface: + dependency: transitive + description: + name: record_platform_interface + sha256: "8a575828733d4c3cb5983c914696f40db8667eab3538d4c41c50cbb79e722ef4" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + record_web: + dependency: transitive + description: + name: record_web + sha256: "024c81eb7f51468b1833a3eca8b461c7ca25c04899dba37abe580bb57afd32e4" + url: "https://pub.dev" + source: hosted + version: "1.1.8" + record_windows: + dependency: transitive + description: + name: record_windows + sha256: "85a22fc97f6d73ecd67c8ba5f2f472b74ef1d906f795b7970f771a0914167e99" + url: "https://pub.dev" + source: hosted + version: "1.0.6" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + url: "https://pub.dev" + source: hosted + version: "1.10.1" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + url: "https://pub.dev" + source: hosted + version: "0.7.4" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + uuid: + dependency: transitive + description: + name: uuid + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" + source: hosted + version: "4.5.1" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 + url: "https://pub.dev" + source: hosted + version: "15.0.0" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" +sdks: + dart: ">=3.8.1 <4.0.0" + flutter: ">=3.27.0" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..5d66600 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,95 @@ +name: app003 +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 + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.0.0+1 + +environment: + sdk: ^3.8.1 + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.8 + fluttertoast: ^8.2.4 + record: ^6.0.0 + http: ^1.2.1 + path_provider: ^2.1.2 + +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 +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + assets: + - assets/images/ + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/to/asset-from-package + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/to/font-from-package