diff --git a/apps/yunxiao/.gitignore b/apps/yunxiao/.gitignore
new file mode 100644
index 0000000..3820a95
--- /dev/null
+++ b/apps/yunxiao/.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-dependencies
+.pub-cache/
+.pub/
+/build/
+/coverage/
+
+# 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/apps/yunxiao/.metadata b/apps/yunxiao/.metadata
new file mode 100644
index 0000000..05a325e
--- /dev/null
+++ b/apps/yunxiao/.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: "90673a4eef275d1a6692c26ac80d6d746d41a73a"
+ channel: "stable"
+
+project_type: app
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a
+ base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a
+ - platform: android
+ create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a
+ base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a
+
+ # 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/apps/yunxiao/README.md b/apps/yunxiao/README.md
new file mode 100644
index 0000000..80b790e
--- /dev/null
+++ b/apps/yunxiao/README.md
@@ -0,0 +1,17 @@
+# yunxiao
+
+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:
+
+- [Learn Flutter](https://docs.flutter.dev/get-started/learn-flutter)
+- [Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
+- [Flutter learning resources](https://docs.flutter.dev/reference/learning-resources)
+
+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/apps/yunxiao/analysis_options.yaml b/apps/yunxiao/analysis_options.yaml
new file mode 100644
index 0000000..0d29021
--- /dev/null
+++ b/apps/yunxiao/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/apps/yunxiao/android/.gitignore b/apps/yunxiao/android/.gitignore
new file mode 100644
index 0000000..be3943c
--- /dev/null
+++ b/apps/yunxiao/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/apps/yunxiao/android/app/build.gradle.kts b/apps/yunxiao/android/app/build.gradle.kts
new file mode 100644
index 0000000..f1fe6df
--- /dev/null
+++ b/apps/yunxiao/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.yuanxuan.yunxiao"
+ compileSdk = flutter.compileSdkVersion
+ ndkVersion = flutter.ndkVersion
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
+ }
+
+ kotlinOptions {
+ jvmTarget = JavaVersion.VERSION_17.toString()
+ }
+
+ defaultConfig {
+ // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
+ applicationId = "com.yuanxuan.yunxiao"
+ // You can update the following values to match your application needs.
+ // For more information, see: https://flutter.dev/to/review-gradle-config.
+ minSdk = flutter.minSdkVersion
+ 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/apps/yunxiao/android/app/src/debug/AndroidManifest.xml b/apps/yunxiao/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 0000000..399f698
--- /dev/null
+++ b/apps/yunxiao/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/apps/yunxiao/android/app/src/main/AndroidManifest.xml b/apps/yunxiao/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..aa58dbd
--- /dev/null
+++ b/apps/yunxiao/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/yunxiao/android/app/src/main/java/com/yuanxuan/yunxiao/MainActivity.java b/apps/yunxiao/android/app/src/main/java/com/yuanxuan/yunxiao/MainActivity.java
new file mode 100644
index 0000000..0928460
--- /dev/null
+++ b/apps/yunxiao/android/app/src/main/java/com/yuanxuan/yunxiao/MainActivity.java
@@ -0,0 +1,6 @@
+package com.yuanxuan.yunxiao;
+
+import com.yuanxuan.webshell.core.web_shell_core.CoreShellActivity;
+
+public class MainActivity extends CoreShellActivity {
+}
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-hdpi/android12splash.png b/apps/yunxiao/android/app/src/main/res/drawable-hdpi/android12splash.png
new file mode 100644
index 0000000..68c47ff
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-hdpi/android12splash.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png b/apps/yunxiao/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..6706081
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-hdpi/splash.png b/apps/yunxiao/android/app/src/main/res/drawable-hdpi/splash.png
new file mode 100644
index 0000000..68c47ff
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-hdpi/splash.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-mdpi/android12splash.png b/apps/yunxiao/android/app/src/main/res/drawable-mdpi/android12splash.png
new file mode 100644
index 0000000..bbfcb22
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-mdpi/android12splash.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png b/apps/yunxiao/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..a3e6573
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-mdpi/splash.png b/apps/yunxiao/android/app/src/main/res/drawable-mdpi/splash.png
new file mode 100644
index 0000000..bbfcb22
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-mdpi/splash.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-night-hdpi/android12splash.png b/apps/yunxiao/android/app/src/main/res/drawable-night-hdpi/android12splash.png
new file mode 100644
index 0000000..68c47ff
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-night-hdpi/android12splash.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-night-mdpi/android12splash.png b/apps/yunxiao/android/app/src/main/res/drawable-night-mdpi/android12splash.png
new file mode 100644
index 0000000..bbfcb22
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-night-mdpi/android12splash.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-night-xhdpi/android12splash.png b/apps/yunxiao/android/app/src/main/res/drawable-night-xhdpi/android12splash.png
new file mode 100644
index 0000000..1c312e0
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-night-xhdpi/android12splash.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png b/apps/yunxiao/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png
new file mode 100644
index 0000000..107d060
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png b/apps/yunxiao/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png
new file mode 100644
index 0000000..c8074f2
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-v21/background.png b/apps/yunxiao/android/app/src/main/res/drawable-v21/background.png
new file mode 100644
index 0000000..8e21404
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-v21/background.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-v21/launch_background.xml b/apps/yunxiao/android/app/src/main/res/drawable-v21/launch_background.xml
new file mode 100644
index 0000000..3cc4948
--- /dev/null
+++ b/apps/yunxiao/android/app/src/main/res/drawable-v21/launch_background.xml
@@ -0,0 +1,9 @@
+
+
+ -
+
+
+ -
+
+
+
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-xhdpi/android12splash.png b/apps/yunxiao/android/app/src/main/res/drawable-xhdpi/android12splash.png
new file mode 100644
index 0000000..1c312e0
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-xhdpi/android12splash.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png b/apps/yunxiao/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..e9f809b
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-xhdpi/splash.png b/apps/yunxiao/android/app/src/main/res/drawable-xhdpi/splash.png
new file mode 100644
index 0000000..1c312e0
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-xhdpi/splash.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-xxhdpi/android12splash.png b/apps/yunxiao/android/app/src/main/res/drawable-xxhdpi/android12splash.png
new file mode 100644
index 0000000..107d060
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-xxhdpi/android12splash.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png b/apps/yunxiao/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..6bef454
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-xxhdpi/splash.png b/apps/yunxiao/android/app/src/main/res/drawable-xxhdpi/splash.png
new file mode 100644
index 0000000..107d060
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-xxhdpi/splash.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-xxxhdpi/android12splash.png b/apps/yunxiao/android/app/src/main/res/drawable-xxxhdpi/android12splash.png
new file mode 100644
index 0000000..c8074f2
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-xxxhdpi/android12splash.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png b/apps/yunxiao/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..94e7aa4
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable-xxxhdpi/splash.png b/apps/yunxiao/android/app/src/main/res/drawable-xxxhdpi/splash.png
new file mode 100644
index 0000000..c8074f2
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable-xxxhdpi/splash.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable/background.png b/apps/yunxiao/android/app/src/main/res/drawable/background.png
new file mode 100644
index 0000000..8e21404
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/drawable/background.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/drawable/launch_background.xml b/apps/yunxiao/android/app/src/main/res/drawable/launch_background.xml
new file mode 100644
index 0000000..3cc4948
--- /dev/null
+++ b/apps/yunxiao/android/app/src/main/res/drawable/launch_background.xml
@@ -0,0 +1,9 @@
+
+
+ -
+
+
+ -
+
+
+
diff --git a/apps/yunxiao/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/apps/yunxiao/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..c79c58a
--- /dev/null
+++ b/apps/yunxiao/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/apps/yunxiao/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/apps/yunxiao/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..b9a6b9b
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/apps/yunxiao/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..98cb161
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/apps/yunxiao/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..9c6b6a8
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/apps/yunxiao/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..884b9ca
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/apps/yunxiao/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..8bdbbfa
Binary files /dev/null and b/apps/yunxiao/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/apps/yunxiao/android/app/src/main/res/values-night-v31/styles.xml b/apps/yunxiao/android/app/src/main/res/values-night-v31/styles.xml
new file mode 100644
index 0000000..1b8e45f
--- /dev/null
+++ b/apps/yunxiao/android/app/src/main/res/values-night-v31/styles.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/apps/yunxiao/android/app/src/main/res/values-night/styles.xml b/apps/yunxiao/android/app/src/main/res/values-night/styles.xml
new file mode 100644
index 0000000..dbc9ea9
--- /dev/null
+++ b/apps/yunxiao/android/app/src/main/res/values-night/styles.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/apps/yunxiao/android/app/src/main/res/values-v31/styles.xml b/apps/yunxiao/android/app/src/main/res/values-v31/styles.xml
new file mode 100644
index 0000000..8012d02
--- /dev/null
+++ b/apps/yunxiao/android/app/src/main/res/values-v31/styles.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/apps/yunxiao/android/app/src/main/res/values/colors.xml b/apps/yunxiao/android/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..c5d5899
--- /dev/null
+++ b/apps/yunxiao/android/app/src/main/res/values/colors.xml
@@ -0,0 +1,4 @@
+
+
+ #FFFFFF
+
\ No newline at end of file
diff --git a/apps/yunxiao/android/app/src/main/res/values/styles.xml b/apps/yunxiao/android/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..0d1fa8f
--- /dev/null
+++ b/apps/yunxiao/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/apps/yunxiao/android/app/src/profile/AndroidManifest.xml b/apps/yunxiao/android/app/src/profile/AndroidManifest.xml
new file mode 100644
index 0000000..399f698
--- /dev/null
+++ b/apps/yunxiao/android/app/src/profile/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/apps/yunxiao/android/build.gradle.kts b/apps/yunxiao/android/build.gradle.kts
new file mode 100644
index 0000000..dbee657
--- /dev/null
+++ b/apps/yunxiao/android/build.gradle.kts
@@ -0,0 +1,24 @@
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+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/apps/yunxiao/android/gradle.properties b/apps/yunxiao/android/gradle.properties
new file mode 100644
index 0000000..fbee1d8
--- /dev/null
+++ b/apps/yunxiao/android/gradle.properties
@@ -0,0 +1,2 @@
+org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
+android.useAndroidX=true
diff --git a/apps/yunxiao/android/gradle/wrapper/gradle-wrapper.properties b/apps/yunxiao/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..e4ef43f
--- /dev/null
+++ b/apps/yunxiao/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\://services.gradle.org/distributions/gradle-8.14-all.zip
diff --git a/apps/yunxiao/android/settings.gradle.kts b/apps/yunxiao/android/settings.gradle.kts
new file mode 100644
index 0000000..ca7fe06
--- /dev/null
+++ b/apps/yunxiao/android/settings.gradle.kts
@@ -0,0 +1,26 @@
+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.11.1" apply false
+ id("org.jetbrains.kotlin.android") version "2.2.20" apply false
+}
+
+include(":app")
diff --git a/apps/yunxiao/assets/branding/icon.png b/apps/yunxiao/assets/branding/icon.png
new file mode 100644
index 0000000..1c45809
Binary files /dev/null and b/apps/yunxiao/assets/branding/icon.png differ
diff --git a/apps/yunxiao/assets/branding/icon_foreground.png b/apps/yunxiao/assets/branding/icon_foreground.png
new file mode 100644
index 0000000..1c45809
Binary files /dev/null and b/apps/yunxiao/assets/branding/icon_foreground.png differ
diff --git a/apps/yunxiao/assets/branding/splash.png b/apps/yunxiao/assets/branding/splash.png
new file mode 100644
index 0000000..f436b71
Binary files /dev/null and b/apps/yunxiao/assets/branding/splash.png differ
diff --git a/apps/yunxiao/flutter_launcher_icons.yaml b/apps/yunxiao/flutter_launcher_icons.yaml
new file mode 100644
index 0000000..61717f8
--- /dev/null
+++ b/apps/yunxiao/flutter_launcher_icons.yaml
@@ -0,0 +1,5 @@
+flutter_launcher_icons:
+ android: true
+ image_path: "assets/branding/icon.png"
+ adaptive_icon_background: "#FFFFFF"
+ adaptive_icon_foreground: "assets/branding/icon_foreground.png"
diff --git a/apps/yunxiao/flutter_native_splash.yaml b/apps/yunxiao/flutter_native_splash.yaml
new file mode 100644
index 0000000..bd05f40
--- /dev/null
+++ b/apps/yunxiao/flutter_native_splash.yaml
@@ -0,0 +1,6 @@
+flutter_native_splash:
+ color: "#FFFFFF"
+ image: "assets/branding/splash.png"
+ android_12:
+ image: "assets/branding/splash.png"
+ icon_background_color: "#FFFFFF"
diff --git a/apps/yunxiao/lib/main.dart b/apps/yunxiao/lib/main.dart
new file mode 100644
index 0000000..12b0b59
--- /dev/null
+++ b/apps/yunxiao/lib/main.dart
@@ -0,0 +1,17 @@
+import 'package:flutter/material.dart';
+import 'package:web_shell_core/web_shell_core.dart';
+
+void main() {
+ runShellApp(
+ ShellEnvironment(
+ appName: '云校嗨学',
+ appKey: 'yunxiao_prod',
+ accentColor: const Color(0xFF4F46E5),
+ backgroundColor: const Color(0xFFFFFFFF),
+ textColor: const Color(0xFF1F2937),
+ mutedTextColor: const Color(0xFF6B7280),
+ splashImage: const AssetImage('assets/branding/splash.png'),
+ initialUrl: 'https://h5.jingdaka.com/pages/user/login/login?sourcePage=%252Fpages%252Fuser_sub%252Fuser_homework%252Fhomework_list%252Fhomework_list%253FcourseId%253D1821860%2526type%253Dredirect%2526domain_name%253Dmjunysod',
+ ),
+ );
+}
diff --git a/apps/yunxiao/pubspec.lock b/apps/yunxiao/pubspec.lock
new file mode 100644
index 0000000..138f441
--- /dev/null
+++ b/apps/yunxiao/pubspec.lock
@@ -0,0 +1,745 @@
+# Generated by pub
+# See https://dart.dev/tools/pub/glossary#lockfile
+packages:
+ ansicolor:
+ dependency: transitive
+ description:
+ name: ansicolor
+ sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.0.3"
+ archive:
+ dependency: transitive
+ description:
+ name: archive
+ sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "4.0.9"
+ args:
+ dependency: transitive
+ description:
+ name: args
+ sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.7.0"
+ async:
+ dependency: transitive
+ description:
+ name: async
+ sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.13.0"
+ boolean_selector:
+ dependency: transitive
+ description:
+ name: boolean_selector
+ sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.1.2"
+ characters:
+ dependency: transitive
+ description:
+ name: characters
+ sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "1.4.1"
+ checked_yaml:
+ dependency: transitive
+ description:
+ name: checked_yaml
+ sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.0.4"
+ cli_util:
+ dependency: transitive
+ description:
+ name: cli_util
+ sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "0.4.2"
+ clock:
+ dependency: transitive
+ description:
+ name: clock
+ sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "1.1.2"
+ collection:
+ dependency: transitive
+ description:
+ name: collection
+ sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "1.19.1"
+ connectivity_plus:
+ dependency: transitive
+ description:
+ name: connectivity_plus
+ sha256: "33bae12a398f841c6cda09d1064212957265869104c478e5ad51e2fb26c3973c"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "7.0.0"
+ connectivity_plus_platform_interface:
+ dependency: transitive
+ description:
+ name: connectivity_plus_platform_interface
+ sha256: "42657c1715d48b167930d5f34d00222ac100475f73d10162ddf43e714932f204"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.0.1"
+ cross_file:
+ dependency: transitive
+ description:
+ name: cross_file
+ sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "0.3.5+2"
+ csslib:
+ dependency: transitive
+ description:
+ name: csslib
+ sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "1.0.2"
+ cupertino_icons:
+ dependency: "direct main"
+ description:
+ name: cupertino_icons
+ sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "1.0.8"
+ dbus:
+ dependency: transitive
+ description:
+ name: dbus
+ sha256: d0c98dcd4f5169878b6cf8f6e0a52403a9dff371a3e2f019697accbf6f44a270
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "0.7.12"
+ device_info_plus:
+ dependency: transitive
+ description:
+ name: device_info_plus
+ sha256: "4df8babf73058181227e18b08e6ea3520cf5fc5d796888d33b7cb0f33f984b7c"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "12.3.0"
+ device_info_plus_platform_interface:
+ dependency: transitive
+ description:
+ name: device_info_plus_platform_interface
+ sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "7.0.3"
+ fake_async:
+ dependency: transitive
+ description:
+ name: fake_async
+ sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "1.3.3"
+ ffi:
+ dependency: transitive
+ description:
+ name: ffi
+ sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.2.0"
+ file:
+ dependency: transitive
+ description:
+ name: file
+ sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "7.0.1"
+ file_picker:
+ dependency: transitive
+ description:
+ name: file_picker
+ sha256: "57d9a1dd5063f85fa3107fb42d1faffda52fdc948cefd5fe5ea85267a5fc7343"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "10.3.10"
+ file_selector_linux:
+ dependency: transitive
+ description:
+ name: file_selector_linux
+ sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "0.9.4"
+ file_selector_macos:
+ dependency: transitive
+ description:
+ name: file_selector_macos
+ sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "0.9.5"
+ file_selector_platform_interface:
+ dependency: transitive
+ description:
+ name: file_selector_platform_interface
+ sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.7.0"
+ file_selector_windows:
+ dependency: transitive
+ description:
+ name: file_selector_windows
+ sha256: "62197474ae75893a62df75939c777763d39c2bc5f73ce5b88497208bc269abfd"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "0.9.3+5"
+ flutter:
+ dependency: "direct main"
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ flutter_launcher_icons:
+ dependency: "direct dev"
+ description:
+ name: flutter_launcher_icons
+ sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "0.14.4"
+ flutter_lints:
+ dependency: "direct dev"
+ description:
+ name: flutter_lints
+ sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "6.0.0"
+ flutter_native_splash:
+ dependency: "direct dev"
+ description:
+ name: flutter_native_splash
+ sha256: "4fb9f4113350d3a80841ce05ebf1976a36de622af7d19aca0ca9a9911c7ff002"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.4.7"
+ flutter_plugin_android_lifecycle:
+ dependency: transitive
+ description:
+ name: flutter_plugin_android_lifecycle
+ sha256: ee8068e0e1cd16c4a82714119918efdeed33b3ba7772c54b5d094ab53f9b7fd1
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.0.33"
+ 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"
+ html:
+ dependency: transitive
+ description:
+ name: html
+ sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "0.15.6"
+ http:
+ dependency: transitive
+ description:
+ name: http
+ sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "1.6.0"
+ http_parser:
+ dependency: transitive
+ description:
+ name: http_parser
+ sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "4.1.2"
+ image:
+ dependency: transitive
+ description:
+ name: image
+ sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "4.8.0"
+ image_picker:
+ dependency: transitive
+ description:
+ name: image_picker
+ sha256: "784210112be18ea55f69d7076e2c656a4e24949fa9e76429fe53af0c0f4fa320"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "1.2.1"
+ image_picker_android:
+ dependency: transitive
+ description:
+ name: image_picker_android
+ sha256: eda9b91b7e266d9041084a42d605a74937d996b87083395c5e47835916a86156
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "0.8.13+14"
+ image_picker_for_web:
+ dependency: transitive
+ description:
+ name: image_picker_for_web
+ sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "3.1.1"
+ image_picker_ios:
+ dependency: transitive
+ description:
+ name: image_picker_ios
+ sha256: b9c4a438a9ff4f60808c9cf0039b93a42bb6c2211ef6ebb647394b2b3fa84588
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "0.8.13+6"
+ image_picker_linux:
+ dependency: transitive
+ description:
+ name: image_picker_linux
+ sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "0.2.2"
+ image_picker_macos:
+ dependency: transitive
+ description:
+ name: image_picker_macos
+ sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "0.2.2+1"
+ image_picker_platform_interface:
+ dependency: transitive
+ description:
+ name: image_picker_platform_interface
+ sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.11.1"
+ image_picker_windows:
+ dependency: transitive
+ description:
+ name: image_picker_windows
+ sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "0.2.2"
+ json_annotation:
+ dependency: transitive
+ description:
+ name: json_annotation
+ sha256: cb09e7dac6210041fad964ed7fbee004f14258b4eca4040f72d1234062ace4c8
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "4.11.0"
+ leak_tracker:
+ dependency: transitive
+ description:
+ name: leak_tracker
+ sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "11.0.2"
+ leak_tracker_flutter_testing:
+ dependency: transitive
+ description:
+ name: leak_tracker_flutter_testing
+ sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "3.0.10"
+ leak_tracker_testing:
+ dependency: transitive
+ description:
+ name: leak_tracker_testing
+ sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "3.0.2"
+ lints:
+ dependency: transitive
+ description:
+ name: lints
+ sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "6.1.0"
+ matcher:
+ dependency: transitive
+ description:
+ name: matcher
+ sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "0.12.18"
+ material_color_utilities:
+ dependency: transitive
+ description:
+ name: material_color_utilities
+ sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "0.13.0"
+ meta:
+ dependency: transitive
+ description:
+ name: meta
+ sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "1.17.0"
+ mime:
+ dependency: transitive
+ description:
+ name: mime
+ sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.0.0"
+ nm:
+ dependency: transitive
+ description:
+ name: nm
+ sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "0.5.0"
+ path:
+ dependency: transitive
+ description:
+ name: path
+ sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "1.9.1"
+ permission_handler:
+ dependency: transitive
+ description:
+ name: permission_handler
+ sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "12.0.1"
+ permission_handler_android:
+ dependency: transitive
+ description:
+ name: permission_handler_android
+ sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "13.0.1"
+ permission_handler_apple:
+ dependency: transitive
+ description:
+ name: permission_handler_apple
+ sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "9.4.7"
+ permission_handler_html:
+ dependency: transitive
+ description:
+ name: permission_handler_html
+ sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "0.1.3+5"
+ permission_handler_platform_interface:
+ dependency: transitive
+ description:
+ name: permission_handler_platform_interface
+ sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "4.3.0"
+ permission_handler_windows:
+ dependency: transitive
+ description:
+ name: permission_handler_windows
+ sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "0.2.1"
+ petitparser:
+ dependency: transitive
+ description:
+ name: petitparser
+ sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "7.0.2"
+ plugin_platform_interface:
+ dependency: transitive
+ description:
+ name: plugin_platform_interface
+ sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.1.8"
+ posix:
+ dependency: transitive
+ description:
+ name: posix
+ sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "6.5.0"
+ sky_engine:
+ dependency: transitive
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ source_span:
+ dependency: transitive
+ description:
+ name: source_span
+ sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "1.10.2"
+ stack_trace:
+ dependency: transitive
+ description:
+ name: stack_trace
+ sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "1.12.1"
+ stream_channel:
+ dependency: transitive
+ description:
+ name: stream_channel
+ sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.1.4"
+ string_scanner:
+ dependency: transitive
+ description:
+ name: string_scanner
+ sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "1.4.1"
+ term_glyph:
+ dependency: transitive
+ description:
+ name: term_glyph
+ sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "1.2.2"
+ test_api:
+ dependency: transitive
+ description:
+ name: test_api
+ sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "0.7.9"
+ typed_data:
+ dependency: transitive
+ description:
+ name: typed_data
+ sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "1.4.0"
+ universal_io:
+ dependency: transitive
+ description:
+ name: universal_io
+ sha256: f63cbc48103236abf48e345e07a03ce5757ea86285ed313a6a032596ed9301e2
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.3.1"
+ url_launcher:
+ dependency: transitive
+ description:
+ name: url_launcher
+ sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "6.3.2"
+ url_launcher_android:
+ dependency: transitive
+ description:
+ name: url_launcher_android
+ sha256: "767344bf3063897b5cf0db830e94f904528e6dd50a6dfaf839f0abf509009611"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "6.3.28"
+ url_launcher_ios:
+ dependency: transitive
+ description:
+ name: url_launcher_ios
+ sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "6.4.1"
+ url_launcher_linux:
+ dependency: transitive
+ description:
+ name: url_launcher_linux
+ sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "3.2.2"
+ url_launcher_macos:
+ dependency: transitive
+ description:
+ name: url_launcher_macos
+ sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "3.2.5"
+ url_launcher_platform_interface:
+ dependency: transitive
+ description:
+ name: url_launcher_platform_interface
+ sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.3.2"
+ url_launcher_web:
+ dependency: transitive
+ description:
+ name: url_launcher_web
+ sha256: d0412fcf4c6b31ecfdb7762359b7206ffba3bbffd396c6d9f9c4616ece476c1f
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.4.2"
+ url_launcher_windows:
+ dependency: transitive
+ description:
+ name: url_launcher_windows
+ sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "3.1.5"
+ vector_math:
+ dependency: transitive
+ description:
+ name: vector_math
+ sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.2.0"
+ vm_service:
+ dependency: transitive
+ description:
+ name: vm_service
+ sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "15.0.2"
+ web:
+ dependency: transitive
+ description:
+ name: web
+ sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "1.1.1"
+ web_shell_core:
+ dependency: "direct main"
+ description:
+ path: "../../packages/web_shell_core"
+ relative: true
+ source: path
+ version: "0.0.1"
+ webview_flutter:
+ dependency: transitive
+ description:
+ name: webview_flutter
+ sha256: a3da219916aba44947d3a5478b1927876a09781174b5a2b67fa5be0555154bf9
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "4.13.1"
+ webview_flutter_android:
+ dependency: transitive
+ description:
+ name: webview_flutter_android
+ sha256: "2a03df01df2fd30b075d1e7f24c28aee593f2e5d5ac4c3c4283c5eda63717b24"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "4.10.13"
+ webview_flutter_platform_interface:
+ dependency: transitive
+ description:
+ name: webview_flutter_platform_interface
+ sha256: "63d26ee3aca7256a83ccb576a50272edd7cfc80573a4305caa98985feb493ee0"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.14.0"
+ webview_flutter_wkwebview:
+ dependency: transitive
+ description:
+ name: webview_flutter_wkwebview
+ sha256: "0d85e8bc5db9a7c49f6ff57cbeafc6cd8216ad9c9ebc70b2c4579d955698933a"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "3.24.1"
+ win32:
+ dependency: transitive
+ description:
+ name: win32
+ sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "5.15.0"
+ win32_registry:
+ dependency: transitive
+ description:
+ name: win32_registry
+ sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.1.0"
+ xml:
+ dependency: transitive
+ description:
+ name: xml
+ sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025"
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "6.6.1"
+ yaml:
+ dependency: transitive
+ description:
+ name: yaml
+ sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "3.1.3"
+sdks:
+ dart: ">=3.11.0 <4.0.0"
+ flutter: ">=3.38.0"
diff --git a/apps/yunxiao/pubspec.yaml b/apps/yunxiao/pubspec.yaml
new file mode 100644
index 0000000..fce00c0
--- /dev/null
+++ b/apps/yunxiao/pubspec.yaml
@@ -0,0 +1,94 @@
+name: yunxiao
+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.11.0
+
+# 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
+ web_shell_core:
+ path: ../../packages/web_shell_core
+
+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: ^6.0.0
+ flutter_launcher_icons: ^0.14.4
+ flutter_native_splash: ^2.4.7
+
+# 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:
+ assets:
+ - assets/branding/
+ # 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
+
+ # 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
diff --git a/flavors/yunxiao.yaml b/flavors/yunxiao.yaml
new file mode 100644
index 0000000..3ec5915
--- /dev/null
+++ b/flavors/yunxiao.yaml
@@ -0,0 +1,15 @@
+app_name: "云校嗨学"
+application_id: "com.yuanxuan.yunxiao"
+app_key: "yunxiao_prod"
+default_url: "https://h5.jingdaka.com/pages/user/login/login?sourcePage=%252Fpages%252Fuser_sub%252Fuser_homework%252Fhomework_list%252Fhomework_list%253FcourseId%253D1821860%2526type%253Dredirect%2526domain_name%253Dmjunysod"
+theme:
+ accent_color: "0xFF4F46E5"
+ bg_color: "0xFFFFFFFF"
+ text_color: "0xFF1F2937"
+ muted_text_color: "0xFF6B7280"
+branding:
+ icon: "icon.png"
+ icon_background: "#FFFFFF"
+ icon_foreground: "icon_foreground.png"
+ splash: "splash.png"
+ splash_color: "#FFFFFF"
diff --git a/flavors/yunxiao/icon.png b/flavors/yunxiao/icon.png
new file mode 100644
index 0000000..1c45809
Binary files /dev/null and b/flavors/yunxiao/icon.png differ
diff --git a/flavors/yunxiao/icon_foreground.png b/flavors/yunxiao/icon_foreground.png
new file mode 100644
index 0000000..1c45809
Binary files /dev/null and b/flavors/yunxiao/icon_foreground.png differ
diff --git a/flavors/yunxiao/splash.png b/flavors/yunxiao/splash.png
new file mode 100644
index 0000000..f436b71
Binary files /dev/null and b/flavors/yunxiao/splash.png differ
diff --git a/tool/generate_app.dart b/tool/generate_app.dart
index 5aca0fe..40daf1b 100644
--- a/tool/generate_app.dart
+++ b/tool/generate_app.dart
@@ -6,9 +6,7 @@ final RegExp _validBrandName = RegExp(r'^[a-z][a-z0-9_]*$');
Future main(List args) async {
if (args.isEmpty) {
- print(
- '\x1B[31m用法:dart run tool/generate_app.dart <品牌名>\x1B[0m',
- );
+ print('\x1B[31m用法:dart run tool/generate_app.dart <品牌名>\x1B[0m');
print('\x1B[33m示例:dart run tool/generate_app.dart quanxue\x1B[0m');
exit(1);
}
@@ -26,9 +24,7 @@ Future main(List args) async {
final File configFile = File('flavors/$brand.yaml');
if (!configFile.existsSync()) {
- print(
- '\x1B[31m[错误] 未找到配置文件:${configFile.path}\x1B[0m',
- );
+ print('\x1B[31m[错误] 未找到配置文件:${configFile.path}\x1B[0m');
exit(1);
}
@@ -64,6 +60,8 @@ Future main(List args) async {
// 5. 覆盖 AndroidManifest.xml 中的应用名称
await _overwriteManifestLabel(appDir, appName);
+ final String? defaultUrl = config['default_url'] as String?;
+
// 6. 生成 lib/main.dart
await _generateDartEntrypoint(
appDir,
@@ -73,6 +71,7 @@ Future main(List args) async {
bgColor,
textColor,
mutedTextColor,
+ defaultUrl,
);
// 7. 生成图标与启动页配置
@@ -94,14 +93,12 @@ Future _createFlutterApp(
print('\x1B[34m[信息] 正在执行 flutter create...\x1B[0m');
final Directory dir = Directory(appDir);
if (dir.existsSync()) {
- print(
- '\x1B[33m[警告] 目录 $appDir 已存在,正在清理...\x1B[0m',
- );
+ print('\x1B[33m[警告] 目录 $appDir 已存在,正在清理...\x1B[0m');
dir.deleteSync(recursive: true);
}
// 提取组织名
- // 例如:com.wanmake.quanxue -> org: com.wanmake
+ // 例如:com.yuanxuan.quanxue -> org: com.yuanxuan
final List segments = applicationId.split('.');
final String org = segments.sublist(0, segments.length - 1).join('.');
@@ -135,9 +132,7 @@ Future _addCoreDependency(String appDir) async {
], workingDirectory: appDir);
if (result.exitCode != 0) {
- print(
- '\x1B[31m[错误] 添加依赖失败:\n${result.stderr}\x1B[0m',
- );
+ print('\x1B[31m[错误] 添加依赖失败:\n${result.stderr}\x1B[0m');
exit(1);
}
}
@@ -186,10 +181,13 @@ Future _generateDartEntrypoint(
String bgColor,
String textColor,
String mutedTextColor,
+ String? defaultUrl,
) async {
print('\x1B[34m[信息] 正在生成 lib/main.dart...\x1B[0m');
final File mainFile = File('$appDir/lib/main.dart');
+ final String urlParam = defaultUrl != null ? "initialUrl: '$defaultUrl'," : "";
+
final String dartContent =
'''
import 'package:flutter/material.dart';
@@ -205,6 +203,7 @@ void main() {
textColor: const Color($textColor),
mutedTextColor: const Color($mutedTextColor),
splashImage: const AssetImage('assets/branding/splash.png'),
+ $urlParam
),
);
}
@@ -226,9 +225,7 @@ Future _generateBrandingAssets(
) async {
print('\x1B[34m[信息] 正在配置图标与启动页...\x1B[0m');
if (config['branding'] == null) {
- print(
- '\x1B[33m[警告] 配置中未找到 branding 段,跳过资源生成。\x1B[0m',
- );
+ print('\x1B[33m[警告] 配置中未找到 branding 段,跳过资源生成。\x1B[0m');
return;
}
final YamlMap branding = config['branding'] as YamlMap;
@@ -237,9 +234,7 @@ Future _generateBrandingAssets(
final Directory brandSourceDir = Directory('flavors/$brand');
final Directory brandTargetDir = Directory('$appDir/assets/branding');
if (!brandSourceDir.existsSync()) {
- print(
- '\x1B[31m[错误] 品牌资源目录不存在:${brandSourceDir.path}\x1B[0m',
- );
+ print('\x1B[31m[错误] 品牌资源目录不存在:${brandSourceDir.path}\x1B[0m');
print(
'\x1B[33m请在 flavors/$brand/ 目录下放置 icon.png、'
'icon_foreground.png、splash.png 等资源文件。\x1B[0m',
@@ -278,13 +273,18 @@ Future _generateBrandingAssets(
exit(1);
}
- // ── 3. 生成 flutter_launcher_icons 配置 ──
+ // ── 3. 确保依赖已解析 ──
+ await Process.run('flutter', ['pub', 'get'], workingDirectory: appDir);
+
+ // ── 4. 生成 flutter_launcher_icons 配置 ──
// 资源路径指向复制后的位置(相对于 appDir)
final String iconPath = 'assets/branding/${branding['icon']}';
- final String iconForeground = 'assets/branding/${branding['icon_foreground']}';
+ final String iconForeground =
+ 'assets/branding/${branding['icon_foreground']}';
final String iconBackground = branding['icon_background'] as String;
- final String iconsYaml = '''
+ final String iconsYaml =
+ '''
flutter_launcher_icons:
android: true
image_path: "$iconPath"
@@ -297,7 +297,8 @@ flutter_launcher_icons:
final String splashPath = 'assets/branding/${branding['splash']}';
final String splashColor = branding['splash_color'] as String;
- final String splashYaml = '''
+ final String splashYaml =
+ '''
flutter_native_splash:
color: "$splashColor"
image: "$splashPath"
@@ -317,9 +318,7 @@ flutter_native_splash:
], workingDirectory: appDir);
if (iconsResult.exitCode != 0) {
- print(
- '\x1B[31m[错误] 图标生成失败:\n${iconsResult.stderr}\x1B[0m',
- );
+ print('\x1B[31m[错误] 图标生成失败:\n${iconsResult.stderr}\x1B[0m');
print('\x1B[33mstdout:\n${iconsResult.stdout}\x1B[0m');
exit(1);
}
@@ -333,9 +332,7 @@ flutter_native_splash:
], workingDirectory: appDir);
if (splashResult.exitCode != 0) {
- print(
- '\x1B[31m[错误] 启动页生成失败:\n${splashResult.stderr}\x1B[0m',
- );
+ print('\x1B[31m[错误] 启动页生成失败:\n${splashResult.stderr}\x1B[0m');
print('\x1B[33mstdout:\n${splashResult.stdout}\x1B[0m');
exit(1);
}
@@ -347,10 +344,12 @@ Future _registerFlutterAssets(String appDir) async {
final File pubspecFile = File('$appDir/pubspec.yaml');
String content = await pubspecFile.readAsString();
- // 查找 flutter: 段并添加 assets 声明
- if (!content.contains('assets:')) {
+ // 检查是否已有未注释的 assets: 声明
+ final bool hasAssets = RegExp(r'^\s+assets:', multiLine: true).hasMatch(content);
+ if (!hasAssets) {
+ // 必须匹配行首的顶层 flutter: 键,忽略缩进的 flutter: (SDK 依赖)
content = content.replaceFirst(
- 'flutter:\n',
+ RegExp(r'^flutter:\s*\n', multiLine: true),
'flutter:\n assets:\n - assets/branding/\n',
);
await pubspecFile.writeAsString(content);