diff --git a/.gitignore b/.gitignore
index 36ad4901d..fe733f8be 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,7 +14,7 @@
*.ipr
*.iws
.idea/
-
+/lib/temp
# 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.
@@ -29,7 +29,13 @@
.pub-cache/
.pub/
/build/
+/android/app/.cxx/
/lib/tools/
/lib/res/constant/github_client_config.dart
# Exceptions to above rules.
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
+
+/build_tools
+/libs
+/pubspec_overrides.yaml
+modules/game_system
diff --git a/.metadata b/.metadata
index b510f8bd6..95f73f55c 100644
--- a/.metadata
+++ b/.metadata
@@ -1,11 +1,45 @@
# 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.
-
+# This file should be version controlled.
version:
- revision: 0b8abb4724aa590dd0f429683339b1e045a1594d
+ revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
channel: stable
project_type: app
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
+ base_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
+ - platform: android
+ create_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
+ base_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
+ - platform: ios
+ create_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
+ base_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
+ - platform: linux
+ create_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
+ base_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
+ - platform: macos
+ create_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
+ base_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
+ - platform: web
+ create_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
+ base_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
+ - platform: windows
+ create_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
+ base_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268
+
+ # 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-EN.md b/README-EN.md
new file mode 100644
index 000000000..13cf46805
--- /dev/null
+++ b/README-EN.md
@@ -0,0 +1,239 @@
+
+
+ FlutterUnit🔖
+
+ ⭐️ All Platform Flutter Experience App ⭐️
+
+
+
+FlutterUnit is a cross-platform experience app, Here, you can fully explore the creativity that Flutter offers.
+
+
+
+
+
+
+
+
+
+ Download v3.0.0 :
+ [Android] •
+ [iOS] •
+ [MacOS] •
+ [Windows] •
+ [Web]
+
+
+
+
+---
+
+
+### Env and Build
+
+#### Flutter Version
+
+```
+·]>> flutter --version
+Flutter 3.35.1 • channel stable • https://github.com/flutter/flutter.git
+Framework • revision 20f8274939 (6 days ago) • 2025-08-14 10:53:09 -0700
+Engine • hash 6cd51c08a88e7bbe848a762c20ad3ecb8b063c0e (revision 1e9a811bf8) (7 days ago) • 2025-08-13 23:35:25.000Z
+Tools • Dart 3.9.0 • DevTools 2.48.0
+```
+
+#### Build Application
+
+```
+·]>> git clone https://github.com/toly1994328/FlutterUnit.git
+·]>> cd FlutterUnit
+
+Build Android:
+·]>> flutter build apk --target-platform --split-per-abi
+Build iOS:
+·]>> flutter build ios
+Build Windows:
+·]>> flutter build windows
+Build Linux:
+·]>> flutter build linux
+Build web:
+·]>> flutter build web
+```
+
+
+#### My Flutter Books
+- 🔥 [免费] [掘金小册 -《Flutter 入门教程》](https://juejin.cn/book/7212822723330834487)
+- 🔥 [掘金小册 -《Flutter 语言基础 - 梦始之地》](https://juejin.cn/book/6844733827617652750)
+- 🔥 [掘金小册 -《Flutter 绘制指南 - 妙笔生花》](https://juejin.im/book/6844733827265331214)
+- 🔥 [掘金小册 -《Flutter 手势探索 - 执掌天下》](https://juejin.cn/book/6896378716427911181)
+- 🔥 [掘金小册 -《Flutter 动画探索 - 流光幻影》](https://juejin.cn/book/6965102582473687071)
+- 🔥 [掘金小册 -《Flutter 滑动探索 - 珠联璧合》](https://juejin.cn/book/6984685333312962573)
+- 🔥 [掘金小册 -《Flutter 布局探索 - 薪火相传》](https://juejin.cn/book/7075958265250578469)
+- 🔥 [掘金小册 -《Flutter 渲染机制 - 聚沙成塔》](https://juejin.cn/book/6965102582473687071)
+
+---
+
+- [Flutter环境配置](https://github.com/toly1994328/FlutterUnit/issues/22)
+- [Flutter实用插件集录 ](https://github.com/toly1994328/FlutterUnit/issues/41)
+- [Flutter要点集录 ](https://github.com/toly1994328/FlutterUnit/labels/point)
+
+
+---
+
+
+#### MacOS 桌面版本组件界面
+
+
+
+#### Windows 桌面版本组件界面
+
+
+
+
+> 开源不易,请我喝咖啡 ~
+
+
+
+
+
+#### Star History
+
+[](https://star-history.com/#toly1994328/FlutterUnit&Date)
+
+### 一、组件的展示页面
+
+#### 1. `300+组件收录`
+
+> Flutter源码中的可用的组件一共350个左右,纷繁复杂,也没有明确的分类标准
+FlutterUnit 对`大大小小,常用不常用`的组件能收的尽量收录。并`根据个人感觉进行评星 `
+`目前收录组件306个`,每个都有至少一个演示展现和代码展示。
+
+| . | . | . |
+|------|------------|------------|
+| | |  |
+
+---
+
+#### 2. 组件详情页
+
+> `213个组件`全部都有详情页。对于重要的组件会详细展现
+一般都会有某个演示对应的组件和属性,尽量做到细致,如果有需要补充,欢迎联系我。
+`最重要的是: 所有的演示展现都是Flutter的组件形成的,而非图片,这就意味着可操作性更高。`
+
+| . | . | . |
+|------|------------|------------|
+| | |  |
+|  |  ||
+
+---
+
+#### 3. 组件的可操作性
+
+> 对一些操作交互的组件或有可操作性的某些组件,`提供操作演示`
+
+| . | . | . |
+|------|------------|------------|
+| | | |
+|  |  ||
+
+---
+
+#### 4. 相关组件的关联切换
+> `相关组件通过link to 可以进行切换, 满足你的探索欲。`
+如果有的关联未加入,欢迎联系我,对我来说,加个数字就行了。
+
+| . | . | . |
+|------|------------|------------|
+||| |
+
+
+---
+
+#### 5. 代码的查看和分享
+> 激动人心的是,你可以通过右侧的图标`展开/隐藏 实现下面效果的代码`
+并且`支持分享`,如果你想亲自体验,so,easy ! 而且`代码高亮样式可以自定义`。
+
+
+| . | . | . |
+|------|------------|------------|
+| | | |
+
+---
+
+
+### 二、全局配置
+
+#### 1. 颜色主题
+> 只提供八种颜色,可在`右滑菜单页`的`我的主题`配置,`可以拓展`
+
+| . | . | . |
+|------|------------|------------|
+| |  |  |
+
+---
+
+
+#### 2.字体配置
+
+> 支持全局字体设置,`可以拓展`
+
+| . | . | . |
+|------|------------|------------|
+| |  | |
+---
+
+
+#### 3.item样式设置
+
+> 支持item样式设置,`可以拓展,支持征集`,详见`Flutter Unit 1.0 征集方案`
+
+| . | . | . |
+|------|------------|------------|
+|| | |
+---
+
+#### 4.代码面板风格设置
+
+> 支持代码风格设置,`可以拓展,支持征集`,详见`Flutter Unit 1.0 征集方案`
+
+| . | . |
+|------|------------|
+|| |
+||
+
+---
+
+
+
+### 三、搜索与收藏功能
+
+
+#### 1.搜索功能
+
+> 由于Flutter中Widget比较杂乱,不太好分类,所以搜索是非常重要的
+另外可以根据星级进行过滤,支持多选。目前正在考虑根据功能分类,之后会有所完善。
+
+
+| . | . | . |
+|------|------------|------------|
+| | |  |
+
+---
+
+#### 2.收藏功能
+
+| 添加收藏集 | 修改收藏集 | 删除收藏集 |
+|------|------------|------------|
+|  |  |  |
+
+| 长按右菜单滑页 | 长按左菜单滑页 | 详情内长按展示收藏菜单 |
+|------|------------|------------|
+|  | |  |
+
+| 删除与数据同步 | 组件加入收藏集 | 收藏集支持多选 |
+|------|------------|------------|
+|  |  |  |
+
+> `FlutterUnit 2.0 `目前基本就是这么多功能,可以在Github中下载打包后的apk玩玩
+希望能对你的Flutter学习有所帮助。
+
+---
diff --git a/README.md b/README.md
index f7f4eba39..0881234c8 100644
--- a/README.md
+++ b/README.md
@@ -1,38 +1,99 @@
+
+
+ FlutterUnit
+
+ ⭐️ 全平台 Flutter 探索应用 ⭐️
+
+
+
+FlutterUnit 是一个全平台体验应用,你可以在这里尽情体验 Flutter 带来的创造力。
+
+
+
+
+
+
+
+
+
+ 下载 App:
+ [Android] •
+ [iOS] •
+ [MacOS] •
+ [Windows] •
+ [Web]
+
+
+
+
+---
+
+### 环境与构建
+
+#### Flutter 版本
+
+```
+·]>> flutter --version
+Flutter 3.35.1 • channel stable • https://github.com/flutter/flutter.git
+Framework • revision 20f8274939 (6 days ago) • 2025-08-14 10:53:09 -0700
+Engine • hash 6cd51c08a88e7bbe848a762c20ad3ecb8b063c0e (revision 1e9a811bf8) (7 days ago) • 2025-08-13 23:35:25.000Z
+Tools • Dart 3.9.0 • DevTools 2.48.0
+```
+
+#### 构建应用
+
+```
+·]>> git clone https://github.com/toly1994328/FlutterUnit.git
+·]>> cd FlutterUnit
+
+Build Android:
+·]>> flutter build apk --target-platform --split-per-abi
+Build iOS:
+·]>> flutter build ios
+Build Windows:
+·]>> flutter build windows
+Build Linux:
+·]>> flutter build linux
+Build web:
+·]>> flutter build web
+```
#### Flutter Unit 周边
-- 🔥 [实体书 - 《Flutter之旅》源码下载地址 ](https://gitee.com/toly1994328/FlutterUnit/attach_files/466731/download)
+- 🔥 [免费] [掘金小册 -《Flutter 入门教程》](https://juejin.cn/book/7212822723330834487)
+- 🔥 [掘金小册 -《Flutter 语言基础 - 梦始之地》](https://juejin.cn/book/6844733827617652750)
- 🔥 [掘金小册 -《Flutter 绘制指南 - 妙笔生花》](https://juejin.im/book/6844733827265331214)
- 🔥 [掘金小册 -《Flutter 手势探索 - 执掌天下》](https://juejin.cn/book/6896378716427911181)
- 🔥 [掘金小册 -《Flutter 动画探索 - 流光幻影》](https://juejin.cn/book/6965102582473687071)
-- [Flutter环境配置](https://github.com/toly1994328/FlutterUnit/issues/22)
-- [Flutter实用插件集录 ](https://github.com/toly1994328/FlutterUnit/issues/41)
-- [Flutter要点集录 ](https://github.com/toly1994328/FlutterUnit/labels/point)
+- 🔥 [掘金小册 -《Flutter 滑动探索 - 珠联璧合》](https://juejin.cn/book/6984685333312962573)
+- 🔥 [掘金小册 -《Flutter 布局探索 - 薪火相传》](https://juejin.cn/book/7075958265250578469)
+- 🔥 [掘金小册 -《Flutter 渲染机制 - 聚沙成塔》](https://juejin.cn/book/6965102582473687071)
+---
-### FlutterUnit 下载体验: 复制链接,在浏览器下载~
+- [Flutter环境配置](https://github.com/toly1994328/FlutterUnit/issues/22)
+- [Flutter实用插件集录 ](https://github.com/toly1994328/FlutterUnit/issues/41)
+- [Flutter要点集录 ](https://github.com/toly1994328/FlutterUnit/labels/point)
+---
-| 平台类型 | 下载地址 | 项目分支地址 | 相关文章 |
-|------|------------|------|------------|
-| Android版 | http://toly1994.com/file/FlutterUnit.apk |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit食用指南》](https://juejin.im/post/6844904147045597191)|
-| iOS版 | 暂未提供,可自己下载项目运行 |[flutter_unit](https://github.com/toly1994328/FlutterUnit)| [《FlutterUnit 食用指南》](https://juejin.im/post/6844904147045597191)|
-| MacOS版 | http://toly1994.com/file/flutter_unit_mac.zip |[flutter_unit_desk](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit_desk)| [《mac版闪亮登场》](https://juejin.im/post/6844904147817332743)|
-| Windows版 |http://toly1994.com/file/FlutterUnitWin.zip | [flutter_unit_desk](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit_desk) | [《win版闪亮登场》](https://juejin.im/post/6847902222626488327)|
-| Web版 | http://toly1994328.gitee.io/flutter_web | [ flutter_unit_web ](https://github.com/toly1994328/FlutterUnit/tree/flutter_unit_web) | [《web版闪亮登场》](https://juejin.im/post/6859888713980182541)|
+#### MacOS 桌面版本组件界面
----
+
-> 当前Flutter 版本
+#### Windows 桌面版本组件界面
-```
-Flutter 2.8.1 • channel stable • https://github.com/flutter/flutter.git
-Framework • revision 77d935af4d (6 weeks ago) • 2021-12-16 08:37:33 -0800
-Engine • revision 890a5fca2e
-Tools • Dart 2.15.1
-```
+
----
+> 开源不易,请我喝咖啡 ~
+
+
+
+
+
+#### Star History
+
+[](https://star-history.com/#toly1994328/FlutterUnit&Date)
### 一、组件的展示页面
@@ -44,9 +105,7 @@ FlutterUnit 对`大大小小,常用不常用`的组件能收的尽量收录。
| . | . | . |
|------|------------|------------|
-| | |  |
-|  |  | |
-
+| | |  |
---
@@ -58,9 +117,8 @@ FlutterUnit 对`大大小小,常用不常用`的组件能收的尽量收录。
| . | . | . |
|------|------------|------------|
-| | |  |
-|  |  ||
-
+| | |  |
+|  |  ||
---
@@ -70,7 +128,8 @@ FlutterUnit 对`大大小小,常用不常用`的组件能收的尽量收录。
| . | . | . |
|------|------------|------------|
-| | | |
+| | | |
+|  |  ||
---
@@ -78,11 +137,10 @@ FlutterUnit 对`大大小小,常用不常用`的组件能收的尽量收录。
> `相关组件通过link to 可以进行切换, 满足你的探索欲。`
如果有的关联未加入,欢迎联系我,对我来说,加个数字就行了。
-
-
| . | . | . |
|------|------------|------------|
-||| |
+||| |
+
---
@@ -90,10 +148,10 @@ FlutterUnit 对`大大小小,常用不常用`的组件能收的尽量收录。
> 激动人心的是,你可以通过右侧的图标`展开/隐藏 实现下面效果的代码`
并且`支持分享`,如果你想亲自体验,so,easy ! 而且`代码高亮样式可以自定义`。
+
| . | . | . |
|------|------------|------------|
-| | | |
-
+| | | |
---
@@ -105,9 +163,7 @@ FlutterUnit 对`大大小小,常用不常用`的组件能收的尽量收录。
| . | . | . |
|------|------------|------------|
-| |  |  |
-
-
+| |  |  |
---
@@ -118,8 +174,7 @@ FlutterUnit 对`大大小小,常用不常用`的组件能收的尽量收录。
| . | . | . |
|------|------------|------------|
-| |  | |
-
+| |  | |
---
@@ -129,8 +184,7 @@ FlutterUnit 对`大大小小,常用不常用`的组件能收的尽量收录。
| . | . | . |
|------|------------|------------|
-|| | |
-
+|| | |
---
#### 4.代码面板风格设置
@@ -139,7 +193,8 @@ FlutterUnit 对`大大小小,常用不常用`的组件能收的尽量收录。
| . | . |
|------|------------|
-|| |
+|| |
+||
---
@@ -156,7 +211,7 @@ FlutterUnit 对`大大小小,常用不常用`的组件能收的尽量收录。
| . | . | . |
|------|------------|------------|
-| | |  |
+| | |  |
---
@@ -164,25 +219,17 @@ FlutterUnit 对`大大小小,常用不常用`的组件能收的尽量收录。
| 添加收藏集 | 修改收藏集 | 删除收藏集 |
|------|------------|------------|
-|  |  |  |
+|  |  |  |
-| 长按左菜单滑页 | 长按右菜单滑页 | 详情内长按展示收藏菜单 |
+| 长按右菜单滑页 | 长按左菜单滑页 | 详情内长按展示收藏菜单 |
|------|------------|------------|
-|  | |  |
+|  | |  |
| 删除与数据同步 | 组件加入收藏集 | 收藏集支持多选 |
|------|------------|------------|
-|  |  |  |
+|  |  |  |
-> `FlutterUnit 1.0 `目前基本就是这么多功能,可以在Github中下载打包后的apk玩玩
+> `FlutterUnit 2.0 `目前基本就是这么多功能,可以在Github中下载打包后的apk玩玩
希望能对你的Flutter学习有所帮助。
---
-
-#### 3.关于我与项目
-> 不多说,都在图里。
-
-| . | . | . |
-|------|------------|------------|
-||| 
-|
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 61b6c4de1..d54e87f36 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -10,20 +10,13 @@
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-lang.github.io/linter/lints/index.html.
- #
- # 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
+ avoid_print: false # Uncomment to disable the `avoid_print` rule
+ file_names: false
+
+analyzer:
+# exclude:
+# - modules/widget_system/widgets/**
+
+
-# Additional information about this file can be found at
-# https://dart.dev/guides/language/analysis-options
diff --git a/android/app/build.gradle b/android/app/build.gradle
deleted file mode 100644
index 513075720..000000000
--- a/android/app/build.gradle
+++ /dev/null
@@ -1,68 +0,0 @@
-def localProperties = new Properties()
-def localPropertiesFile = rootProject.file('local.properties')
-if (localPropertiesFile.exists()) {
- localPropertiesFile.withReader('UTF-8') { reader ->
- localProperties.load(reader)
- }
-}
-
-def flutterRoot = localProperties.getProperty('flutter.sdk')
-if (flutterRoot == null) {
- throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
-}
-
-def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
-if (flutterVersionCode == null) {
- flutterVersionCode = '1'
-}
-
-def flutterVersionName = localProperties.getProperty('flutter.versionName')
-if (flutterVersionName == null) {
- flutterVersionName = '1.0'
-}
-
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
-
-android {
- compileSdkVersion 30
-
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
- }
-
- kotlinOptions {
- jvmTarget = '1.8'
- }
-
- sourceSets {
- main.java.srcDirs += 'src/main/kotlin'
- }
-
- defaultConfig {
- // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
- applicationId "com.toly1994.flutter_unit"
- minSdkVersion 16
- targetSdkVersion 30
- versionCode flutterVersionCode.toInteger()
- versionName flutterVersionName
- }
-
- 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.debug
- }
- }
-}
-
-flutter {
- source '../..'
-}
-
-dependencies {
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
-}
diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts
new file mode 100644
index 000000000..d73f8c2d9
--- /dev/null
+++ b/android/app/build.gradle.kts
@@ -0,0 +1,53 @@
+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.toly1994.flutter_unit"
+ compileSdk = flutter.compileSdkVersion
+ ndkVersion = flutter.ndkVersion
+
+ 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.toly1994.flutter_unit"
+ // 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 {
+ getByName("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")
+ isShrinkResources = true // 移除未使用的资源
+ isMinifyEnabled = true // 启用 R8 代码压缩
+ proguardFiles(
+ getDefaultProguardFile("proguard-android-optimize.txt"),
+ "proguard-rules.pro"
+ )
+ ndk {
+ debugSymbolLevel = "none"
+ }
+ }
+ }
+}
+
+flutter {
+ source = "../.."
+}
diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro
new file mode 100644
index 000000000..e9ffa01ad
--- /dev/null
+++ b/android/app/proguard-rules.pro
@@ -0,0 +1,2 @@
+-dontwarn javax.annotation.**
+-keep class javax.annotation.** { *; }
\ No newline at end of file
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 400a7ecea..678734418 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -1,5 +1,26 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -9,6 +30,7 @@
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
+ android:exported="true"
android:windowSoftInputMode="adjustResize">
上\nclass Bottom2TopRouter extends PageRouteBuilder {\n final Widget child;\n final int duration;\n final Curve curve;\n\n Bottom2TopRouter(\n {this.child, this.duration = 500, this.curve = Curves.fastOutSlowIn})\n : super(\n transitionDuration: Duration(milliseconds: duration),\n pageBuilder: (ctx, a1, a2) {\n return child;\n },\n transitionsBuilder: (\n ctx,\n a1,\n a2,\n Widget child,\n ) => SlideTransition(\n position: Tween(\n begin: Offset(0.0, 1.0),\n end: Offset(0.0, 0.0),\n ).animate(CurvedAnimation(parent: a1, curve: curve)),\n child: child));\n}\n"},{"id":null,"widgetId":174,"name":"PopupMenuDivider基本使用","priority":1,"subtitle":" \n【height】 : 高度 【double】","code":"import 'package:flutter/material.dart';\nimport '../../../dialogs/dialog_about.dart';\nclass CustomPopupMenuDivider extends StatelessWidget {\n final map = {\n \"关于\": Icons.info_outline,\n \"帮助\": Icons.help_outline,\n \"问题反馈\": Icons.add_comment,\n };\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: Column(\n children: [\n _buildPopupMenuButton(context),\n PopupMenuDivider(),\n ],\n ),\n );\n }\n\n PopupMenuButton _buildPopupMenuButton(BuildContext context) {\n return PopupMenuButton(\n itemBuilder: (context) => [\n ...buildItems().sublist(0, 2),\n PopupMenuDivider(),\n ...buildItems().sublist(2, 3)\n ],\n offset: Offset(0, 50),\n color: Color(0xffF4FFFA),\n elevation: 1,\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.only(\n topLeft: Radius.circular(20),\n bottomRight: Radius.circular(20),\n topRight: Radius.circular(5),\n bottomLeft: Radius.circular(5),\n )),\n onSelected: (e) {\n print(e);\n if (e == '关于') {\n DialogAbout.show(context);\n }\n },\n onCanceled: () => print('onCanceled'),\n );\n }\n\n List> buildItems() {\n return map.keys\n .toList()\n .map((e) => PopupMenuItem(\n value: e,\n child: Wrap(\n spacing: 10,\n children: [\n Icon(\n map[e],\n color: Colors.blue,\n ),\n Text(e),\n ],\n )))\n .toList();\n }\n}\n"},{"id":null,"widgetId":195,"name":"CupertinoScrollbar基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【controller】 : 控制器 【ScrollController】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomCupertinoScrollbar extends StatelessWidget {\n final data = [\n Colors.purple[50],\n Colors.purple[100],\n Colors.purple[200],\n Colors.purple[300],\n Colors.purple[400],\n Colors.purple[500],\n Colors.purple[600],\n Colors.purple[700],\n Colors.purple[800],\n Colors.purple[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: CupertinoScrollbar(\n child: ListView(\n padding: EdgeInsets.symmetric(horizontal: 5),\n children: data\n .map((color) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 50,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ))\n .toList(),\n ),\n ),\n );\n }\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}"},{"id":null,"widgetId":172,"name":"FutureBuilder基本使用","priority":1,"subtitle":" \n【builder】 : 子组件 【AsyncWidgetBuilder】\n【initialData】 : 初始数据 【T】\n【future】 : 异步任务 【Future】","code":"import 'package:flutter/material.dart';\nclass CustomFutureBuilder extends StatefulWidget {\n @override\n _CustomFutureBuilderState createState() => _CustomFutureBuilderState();\n}\n\nclass _CustomFutureBuilderState extends State {\n Future _future;\n\n @override\n void initState() {\n _future = loadData();\n super.initState();\n }\n\n @override\n Widget build(BuildContext context) {\n return Container(\n child: FutureBuilder(\n initialData: 'Load',\n future: _future,\n builder: (ctx, snap) {\n if (snap.connectionState == ConnectionState.done) {\n return Text(snap.data);\n }\n if (snap.connectionState == ConnectionState.waiting) {\n return CircularProgressIndicator();\n }\n if (snap.hasError) {\n return Text('Error');\n }\n return Container();\n }),\n );\n }\n\n Future loadData() async {\n await Future.delayed(Duration(seconds: 2));\n return 'LoadeSuccess';\n }\n}\n"},{"id":null,"widgetId":182,"name":"Overlay基本使用","priority":1,"subtitle":" \n Overlay.of(context).insert插入全局组件","code":"import 'package:flutter/material.dart';\nclass CustomOverlay extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n children: [\n Container(\n height: 50,\n child: RawMaterialButton(\n elevation: 2,\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n fillColor: Colors.blue,\n splashColor: Colors.orange,\n textStyle: TextStyle(color: Colors.white),\n child: Icon(Icons.add),\n onPressed: ()=>showFloating(context),\n ),\n ),\n Container(\n height: 50,\n child: RawMaterialButton(\n elevation: 2,\n shape: CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n fillColor: Colors.red,\n splashColor: Colors.orange,\n textStyle: TextStyle(color: Colors.white),\n child: Icon(Icons.remove),\n onPressed: hideFloating,\n ),\n ),\n ],\n );\n }\n}\n"},{"id":null,"widgetId":139,"name":"CupertinoPicker基本使用","priority":1,"subtitle":" \n【children】 : 子组件列表 【List】\n【offAxisFraction】 : 轴偏移率 【double】\n【squeeze】 : 挤压率 【double】\n【diameterRatio】 : 高与圆柱直径比率 【double】\n【itemExtent】 : 间距 【double】\n【backgroundColor】 : 背景色 【Color】\n【onSelectedItemChanged】 : 选中事件 【Function(int)】","code":"import 'package:flutter/cupertino.dart';\nclass CustomCupertinoPicker extends StatelessWidget {\n final names = [\n 'Java',\n 'Kotlin',\n 'Dart',\n 'Swift',\n 'C++',\n 'Python',\n \"JavaScript\",\n \"PHP\",\n \"Go\",\n \"Object-c\"\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 150,\n child: CupertinoPicker(\n backgroundColor: CupertinoColors.systemGrey.withAlpha(33),\n diameterRatio: 1,\n offAxisFraction: 0.4,\n squeeze: 1.5,\n itemExtent: 40,\n onSelectedItemChanged: (position) {\n print('当前条目 ${names[position]}');\n },\n children: names.map((e) => Center(child: Text(e))).toList()),\n );\n }\n}\n"},{"id":null,"widgetId":118,"name":"AnimatedOpacity基本使用","priority":1,"subtitle":" \n【child】 : 孩子组件 【Widget】\n【duration】 : 动画时长 【Duration】\n【onEnd】 : 动画结束回调 【Function()】\n【curve】 : 动画曲线 【Duration】\n【opacity】 : 透明度 【double】","code":"import 'package:flutter/material.dart';\nclass CustomAnimatedOpacity extends StatefulWidget {\n @override\n _CustomAnimatedOpacityState createState() => _CustomAnimatedOpacityState();\n}\n\nclass _CustomAnimatedOpacityState extends State {\n double _opacity = 1.0;\n\n @override\n Widget build(BuildContext context) {\n return Column(\n children: [\n Switch(\n value: _opacity == 0,\n onChanged: (v) {\n setState(() {\n _opacity = v ? 0 : 1.0;\n });\n }),\n Container(\n color: Colors.grey.withAlpha(22),\n width: 200,\n height: 100,\n child: AnimatedOpacity(\n duration: Duration(seconds: 1),\n curve: Curves.fastOutSlowIn,\n opacity: _opacity,\n onEnd: () => print('End'),\n child: Icon(Icons.android, color: Colors.green, size: 60),\n ),\n ),\n ],\n );\n }\n}\n"},{"id":null,"widgetId":55,"name":"DropdownButton的样式指定","priority":2,"subtitle":" \n【isDense】 : 是否紧排 【bool】\n【iconSize】 : 图标大小 【double】\n【hint】 : 提示组件 【Widget】\n【iconEnabledColor】 : 图标颜色 【Color】","code":"import 'package:flutter/material.dart';\nclass StyleDropDownButton extends StatefulWidget {\n @override\n _StyleDropDownButtonState createState() => _StyleDropDownButtonState();\n}\n\nclass _StyleDropDownButtonState extends State {\n Color _color = Colors.red ;\n final _colors = [Colors.red, Colors.yellow, Colors.blue, Colors.green];\n final _info = [\"红色\", \"黄色\", \"蓝色\", \"绿色\"];\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n crossAxisAlignment: WrapCrossAlignment.center,\n children: [\n Container(\n margin: EdgeInsets.symmetric(horizontal: 20),\n width: 50,\n height: 50,\n color: _color??Colors.transparent,\n ),\n DropdownButton(\n hint: Text('请选择'),\n isDense: true,\n iconSize:20,\n iconEnabledColor:_color??Colors.orange,\n value: _color,\n items: _buildItems(),\n onChanged: (v) => setState(() => _color = v)),\n ],\n );\n }\n\n List> _buildItems() => _colors\n .map((e) => DropdownMenuItem(\n value: e,\n child: Text(\n _info[_colors.indexOf(e)],\n style: TextStyle(color: e),\n )))\n .toList();\n}\n"},{"id":null,"widgetId":55,"name":"DropdownButton基本用法","priority":1,"subtitle":" \n【value】 : 当前值 【T】\n【items】 : 下拉选框 【List>】\n【icon】 : 图标 【Widget】\n【elevation】 : 影深 【double】\n【onChanged】 : 选择条目事件 【Function(T)】\n【backgroundColor】 : 背景色 【Color】","code":"import 'package:flutter/material.dart';\nclass CustomDropDownButton extends StatefulWidget {\n @override\n _CustomDropDownButtonState createState() => _CustomDropDownButtonState();\n}\n\nclass _CustomDropDownButtonState extends State {\n Color _color = Colors.red;\n final _colors = [Colors.red, Colors.yellow, Colors.blue, Colors.green];\n final _info = [\"红色\", \"黄色\", \"蓝色\", \"绿色\"];\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n children: [\n Container(\n margin: EdgeInsets.symmetric(horizontal: 20),\n width: 50,\n height: 50,\n color: _color,\n ),\n DropdownButton(\n value: _color,\n elevation: 1,\n icon: Icon(\n Icons.expand_more,\n size: 20,\n color: _color,\n ),\n items: _buildItems(),\n onChanged: (v) => setState(() => _color = v)),\n ],\n );\n }\n\n List> _buildItems() => _colors\n .map((e) => DropdownMenuItem(\n value: e,\n child: Text(\n _info[_colors.indexOf(e)],\n style: TextStyle(color: e),\n )))\n .toList();\n}"},{"id":null,"widgetId":56,"name":"PopupMenuButton基本使用","priority":1,"subtitle":" \n【itemBuilder】 : 构造器 【PopupMenuItemBuilder】\n【offset】 : 偏移 【Offset】\n【color】 : 背景颜色 【Color】\n【shape】 : 形状 【ShapeBorder】\n【elevation】 : 影深 【double】\n【onCanceled】 : 取消事件 【Function()】\n【onSelected】 : 选择事件 【Function(T)】","code":"import 'package:flutter/material.dart';\nimport '../../../dialogs/dialog_about.dart';\nclass CustomPopupMenuButton extends StatefulWidget {\n @override\n _CustomPopupMenuButtonState createState() => _CustomPopupMenuButtonState();\n}\n\nclass _CustomPopupMenuButtonState extends State {\n final map = {\n \"关于\": Icons.info_outline,\n \"帮助\": Icons.help_outline,\n \"问题反馈\": Icons.add_comment,\n };\n\n @override\n Widget build(BuildContext context) {\n return PopupMenuButton(\n itemBuilder: (context) => buildItems(),\n offset: Offset(0, 50),\n color: Color(0xffF4FFFA),\n elevation: 1,\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.only(\n topLeft: Radius.circular(20),\n bottomRight: Radius.circular(20),\n topRight: Radius.circular(5),\n bottomLeft: Radius.circular(5),\n )),\n onSelected: (e) {\n print(e);\n if (e == '关于') {\n DialogAbout.show(context);\n }\n },\n onCanceled: () => print('onCanceled'),\n );\n }\n\n List> buildItems() {\n return map.keys\n .toList()\n .map((e) => PopupMenuItem(\n value: e,\n child: Wrap(\n spacing: 10,\n children: [\n Icon(\n map[e],\n color: Colors.blue,\n ),\n Text(e),\n ],\n )))\n .toList();\n }\n}\n"},{"id":null,"widgetId":160,"name":"Material的shape属性","priority":2,"subtitle":" \n【shape】 : 形状 【ShapeBorder】,","code":"import 'package:flutter/material.dart';\nclass ShapeMaterial extends StatelessWidget {\n\n final shapeMap = {\n 'BorderDirectional': BorderDirectional(\n top: BorderSide(\n color: Colors.white,\n ),\n start: BorderSide(color: Colors.black, width: 15),\n bottom: BorderSide(\n color: Colors.white,\n )),\n 'Border': Border(\n top: BorderSide(width: 5.0, color: Color(0xFFFFDFDFDF)),\n left: BorderSide(width: 5.0, color: Color(0xFFFFDFDFDF)),\n right: BorderSide(width: 5.0, color: Color(0xFFFF7F7F7F)),\n bottom: BorderSide(width: 5.0, color: Color(0xFFFF7F7F7F)),\n ),\n 'Circle': CircleBorder(\n side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)),\n ),\n 'RoundedRectangleBorder': RoundedRectangleBorder(\n side: BorderSide(width: 1.0, color: Colors.black),\n borderRadius: BorderRadius.all(Radius.circular(15))),\n 'ContinuousRectangleBorder': ContinuousRectangleBorder(\n side: BorderSide.none,\n borderRadius: BorderRadius.circular(40.0),\n )\n };\n\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 10,\n runSpacing: 10,\n children: shapeMap.keys.map((e) => _buildMaterial(e)).toList());\n }\n\n Material _buildMaterial(String type) => Material(\n shadowColor: Colors.blue,\n shape: shapeMap[type],\n color: Colors.orange,\n elevation: 3,\n textStyle: TextStyle(color: Colors.white),\n child: Container(\n alignment: Alignment.center,\n width: 300,\n height: 60,\n child: Text(\n type,\n ),\n ),\n );\n}\n"},{"id":null,"widgetId":160,"name":"Material基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【type】 : 类型 【MaterialType】\n【elevation】 : 影深 【double】\n【shadowColor】 : 阴影颜色 【Color】\n【color】 : 颜色 【Color】","code":"import 'package:flutter/material.dart';\nclass CustomMaterial extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Wrap(\n spacing: 10,\n runSpacing: 10,\n children: MaterialType.values.map((e) => _buildMaterial(e)).toList());\n }\n\n Material _buildMaterial(MaterialType type) => Material(\n shadowColor: Colors.blue,\n type: type,\n color: Colors.orange,\n elevation: 3,\n child: Container(\n alignment: Alignment.center,\n width: 100,\n height: 60,\n child: Text(\n type.toString().split('.')[1],\n style: TextStyle(color: Colors.black),\n ),\n ),\n );\n}\n"},{"id":null,"widgetId":194,"name":"Scrollbar基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【controller】 : 控制器 【ScrollController】","code":"import 'package:flutter/material.dart';\nclass CustomScrollbar extends StatelessWidget {\n final data = [\n Colors.purple[50],\n Colors.purple[100],\n Colors.purple[200],\n Colors.purple[300],\n Colors.purple[400],\n Colors.purple[500],\n Colors.purple[600],\n Colors.purple[700],\n Colors.purple[800],\n Colors.purple[900],\n ];\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 200,\n child: Scrollbar(\n child: ListView(\n padding: EdgeInsets.symmetric(horizontal: 5),\n children: data\n .map((color) => Container(\n alignment: Alignment.center,\n width: 100,\n height: 50,\n color: color,\n child: Text(\n colorString(color),\n style: TextStyle(color: Colors.white, shadows: [\n Shadow(\n color: Colors.black,\n offset: Offset(.5, .5),\n blurRadius: 2)\n ]),\n ),\n ))\n .toList(),\n ),\n ),\n );\n }\n\n String colorString(Color color) =>\n \"#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}\";\n}"},{"id":null,"widgetId":170,"name":"WillPopScope使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【onWillPop】 : 返回回调 【WillPopCallback】","code":"import 'package:flutter/material.dart';\nclass CustomWillPopScope extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n child: WillPopScope(child: (BackButton()),\n onWillPop: ()=>_willPop(context)),\n );\n }\n\n Future _willPop(context) async{\n return await showDialog(\n context: context,\n builder: (context) => AlertDialog(\n shape: RoundedRectangleBorder(\n borderRadius: BorderRadius.all(Radius.circular(10))),\n title: Text('提示'),\n content: Text('你确定要离开此页吗?'),\n actions: [\n FlatButton(\n onPressed: () => Navigator.of(context).pop(true),\n child: Text('确定'),\n ),\n FlatButton(\n onPressed: () => Navigator.of(context).pop(false),\n child: Text('取消'),\n ),\n\n ],\n ),\n ) ?? false;\n\n }\n}\n"},{"id":null,"widgetId":151,"name":"TableRowInkWell基本事件","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【onTap】 : 点击事件 【Function()】\n【onDoubleTap】 : 双击事件 【Function()】\n【onLongPress】 : 长按事件 【Function()】\n【onHighlightChanged】 : 高亮变化回调 【Function(bool)】","code":"import 'package:flutter/material.dart';\nclass CustomTableRowInkWell extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n var title = _ItemBean(\"单位称\", \"量纲\", \"单位\", \"单位名称\", \"单位符号\");\n var m = _ItemBean(\"长度\", \"L\", \"1m\", \"米\", \"m\");\n var kg = _ItemBean(\"质量\", \"M\", \"1Kg\", \"千克\", \"Kg\");\n var s = _ItemBean(\"时间\", \"T\", \"1s\", \"秒\", \"s\");\n var a = _ItemBean(\"安培\", \"Ι\", \"1A\", \"安培\", \"A\");\n var k = _ItemBean(\"热力学温度\", \"θ\", \"1K\", \"开尔文\", \"K\");\n var mol = _ItemBean(\"物质的量\", \"N\", \"1mol\", \"摩尔\", \"mol\");\n var cd = _ItemBean(\"发光强度\", \"J\", \"1cd\", \"坎德拉\", \"cd\");\n\n var data = <_ItemBean>[title, m, kg, s, a, k, mol, cd];\n\n return SingleChildScrollView(\n scrollDirection: Axis.horizontal,\n child: Table(\n columnWidths: const {\n 0: FixedColumnWidth(80.0),\n 1: FixedColumnWidth(80.0),\n 2: FixedColumnWidth(80.0),\n 3: FixedColumnWidth(80.0),\n 4: FixedColumnWidth(80.0),\n },\n defaultVerticalAlignment: TableCellVerticalAlignment.middle,\n border: TableBorder.all(\n color: Colors.orangeAccent, width: 1.0, style: BorderStyle.solid),\n children: data\n .map((item) => TableRow(children: [\n TableRowInkWell(\n onTap: () => print('onTap'),\n onDoubleTap: () => print('onDoubleTap'),\n onLongPress: () => print('onLongPress'),\n onHighlightChanged: (v) => print('onHighlightChanged:$v'),\n child: Center(\n child: Text(\n item.name,\n style: TextStyle(color: Colors.blue),\n )),\n ),\n Padding(\n padding: const EdgeInsets.all(8.0),\n child: Center(child: Text(item.symbol)),\n ),\n Padding(\n padding: const EdgeInsets.all(8.0),\n child: Center(child: Text(item.unitSymbol)),\n ),\n Padding(\n padding: const EdgeInsets.all(8.0),\n child: Center(child: Text(item.unitName)),\n ),\n Padding(\n padding: const EdgeInsets.all(8.0),\n child: Center(child: Text(item.unit)),\n ),\n ]))\n .toList(),\n ),\n );\n }\n}\n\nclass _ItemBean {\n String name;\n String symbol;\n String unit;\n String unitName;\n String unitSymbol;\n\n _ItemBean(this.name, this.symbol, this.unit, this.unitName, this.unitSymbol);\n}\n\n"},{"id":null,"widgetId":135,"name":"MonthPicker基本使用","priority":1,"subtitle":" \n【selectedDate】 : 选中日期 【DateTime】\n【firstDate】 : 最前日期限制 【DateTime】\n【lastDate】 : 最后日期限制 【DateTime】\n【onChanged】 : 点击回调 【Function(DateTime)】","code":"import 'package:flutter/material.dart';\nclass CustomMonthPicker extends StatefulWidget {\n @override\n _CustomMonthPickerState createState() => _CustomMonthPickerState();\n}\n\nclass _CustomMonthPickerState extends State {\n DateTime _date = DateTime.now();\n\n @override\n Widget build(BuildContext context) {\n return Container(\n height: 350,\n child: MonthPicker(\n selectedDate: _date,\n onChanged: (date) => setState(() => _date = date),\n firstDate: DateTime(2018),\n lastDate: DateTime(2030),\n ),\n );\n }\n}\n"},{"id":null,"widgetId":143,"name":"CupertinoContextMenu基本使用","priority":1,"subtitle":" \n【child】 : 子组件 【Widget】\n【actions】 : 行为组件集 【List】\n【previewBuilder】 : 动画构造器 【ContextMenuPreviewBuilder】","code":"import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nclass CustomCupertinoContextMenu extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return Container(\n child: _buildCupertinoContextMenu(context),\n );\n }\n\n final info= ['保存图片','立刻呼叫','添加到收藏夹'];\n\n Widget _buildCupertinoContextMenu(context) => Container(\n decoration: BoxDecoration(\n image: DecorationImage(\n image: AssetImage('assets/images/sabar_bar.jpg'),\n fit: BoxFit.cover),\n borderRadius: BorderRadius.all(Radius.circular(50))),\n width: 100,\n height: 100,\n child: CupertinoContextMenu(\n child: Container(\n decoration: BoxDecoration(\n image: DecorationImage(\n image: AssetImage('assets/images/sabar_bar.jpg'),\n fit: BoxFit.cover),\n borderRadius: BorderRadius.all(Radius.circular(50))),\n ),\n actions: info.map((e)=>CupertinoContextMenuAction(\n child: Center(child: Text(e)),\n onPressed: () => Navigator.pop(context),\n )).toList())\n );\n}\n"}]
\ No newline at end of file
diff --git a/assets/data/web/widget.json b/assets/data/web/widget.json
new file mode 100644
index 000000000..8dd52f79c
--- /dev/null
+++ b/assets/data/web/widget.json
@@ -0,0 +1 @@
+[{"id":1,"family":0,"name":"Container","nameCN":"容器组件","lever":5,"linkWidget":"74,85,80,78,70,123","info":"用于容纳单个子组件的容器组件。集成了若干个单子组件的功能,如内外边距、形变、装饰、约束等...","image":"assets/images/widgets/Container.png"},{"id":2,"family":0,"name":"Text","nameCN":"文字组件","lever":5,"linkWidget":"101,324","info":"用于显示文字的组件。拥有的属性非常多,足够满足你的使用需求,核心样式由style属性控制。","image":"assets/images/widgets/Text.png"},{"id":3,"family":0,"name":"Card","nameCN":"卡片组件","lever":3,"linkWidget":"160","info":" 基于Material组件实现,用于将单个组件卡片化。并使其具有投影效果,可加外边距,也可以自定义卡片形状。","image":"assets/images/widgets/Card.png"},{"id":4,"family":0,"name":"FlutterLogo","lever":1,"linkWidget":"","nameCN":"Flutter图标","info":"用于展示Flutter图标组件。可定义颜色、尺寸、展示模式等信息,是一个非常简单的组件。","image":"assets/images/widgets/FlutterLogo.png"},{"id":5,"family":0,"name":"Banner","lever":1,"linkWidget":"","nameCN":"角标组件","info":"用于角标显示的组件。可容纳一个子组件,可选择方位添加角标及信息文字,可设置颜色。","image":"assets/images/widgets/Banner.png"},{"id":6,"family":0,"name":"Icon","lever":2,"linkWidget":"7,30,125","nameCN":"图标组件","info":"用于图标显示的组件。可指定图标资源、大小、颜色。非常简单,但是非常用","image":"assets/images/widgets/Icon.png"},{"id":7,"family":0,"name":"ImageIcon","linkWidget":"6,30,125","nameCN":"容器","lever":1,"info":"用于将一个图片变为纯色的组件。可指定大小、颜色。","image":"assets/images/widgets/ImageIcon.png"},{"id":8,"family":0,"name":"FadeInImage","nameCN":"淡入图片","linkWidget":"38","lever":2,"info":"透明渐变地加载一张图片。可指定占位图片、进退的动画曲线、时间、宽高、fit类型、对齐方式、重复方式等。","image":""},{"id":9,"family":0,"name":"CircleAvatar","nameCN":"圆形组件","linkWidget":"","lever":4,"info":"可将一张图片变成圆形,并且中间可以放置一个组件。可指定半径、前景色、背景色等。","image":""},{"id":10,"family":0,"name":"Visibility","nameCN":"显隐组件","linkWidget":"71","lever":3,"info":"控制一个组件显示或隐藏,可设置隐藏后的占位组件。与其功能相似的由OffStage组件。","image":"assets/images/widgets/Visibility.png"},{"id":11,"family":0,"name":"Chip","nameCN":"小条组件","linkWidget":"12,13,14,15,153","lever":4,"info":"一个横向的圆边小条,可以包含左中右三个组件。可以指定颜色、阴影色和点击事件。","image":"assets/images/widgets/Chip.png"},{"id":12,"family":0,"name":"ChoiceChip","nameCN":"选择小条","lever":3,"linkWidget":"11,13,14,15,153","info":"和Chip组件类似的样式,有一些选择的属性。可以指定选中时的颜色、阴影色和选择事件。","image":"assets/images/widgets/ChoiceChip.png"},{"id":13,"family":0,"name":"ActionChip","nameCN":"事件小条","lever":3,"linkWidget":"11,12,14,15,153","info":"和Chip组件类似的样式,有一些点击的属性。可以指定点击时的阴影深、点击事件。","image":"assets/images/widgets/ActionChip.png"},{"id":14,"family":0,"name":"InputChip","nameCN":"综合小条","linkWidget":"11,12,13,15,153","lever":4,"info":"和Chip组件类似的样式,集成了点击、删除、选择事件为一体。注意:点击事件和选择事件不能同时存在。","image":"assets/images/widgets/InputChip.png"},{"id":15,"family":0,"name":"FilterChip","linkWidget":"11,12,13,14,153","nameCN":"过滤小条","lever":4,"info":"和Chip组件类似的样式,具有选中与否的属性和选中事件。当选中时左侧组件上层会被✔️遮罩。","image":"assets/images/widgets/FilterChip.png"},{"id":16,"family":0,"name":"ListTile","nameCN":"列表瓦片","linkWidget":"162,334","lever":3,"info":"Flutter提供的一个通用列表条目结构,为左中右结构。相应位置可插入组件,可以很方便地应对特定的条目。","image":"assets/images/widgets/ListTile.png"},{"id":17,"family":0,"name":"CheckboxListTile","nameCN":"复选瓦片","linkWidget":"39","lever":3,"info":"Flutter提供的一个通用列表条目结构,为左中结构,尾部是一个CheckBox。相应位置可插入组件,可以很方便地应对特定的条目。","image":"assets/images/widgets/CheckBoxListTile.png"},{"id":18,"family":0,"name":"SwitchListTile","nameCN":"切钮瓦片","linkWidget":"40","lever":3,"info":"Flutter提供的一个通用列表条目结构,为左中结构,尾部是一个Switch。相应位置可插入组件,可以很方便地应对特定的条目。","image":"assets/images/widgets/SwitchListTile.png"},{"id":19,"family":0,"name":"RadioListTile","nameCN":"选钮瓦片","linkWidget":"45","lever":3,"info":"Flutter提供的一个通用列表条目结构,为中右结构,尾部是一个Radio。相应位置可插入组件,可以很方便地应对特定的条目。","image":"assets/images/widgets/RadioListTile.png"},{"id":20,"family":0,"name":"GridTileBar","nameCN":"网格瓦片头","linkWidget":"21","lever":2,"info":"Flutter提供的一个通用头结构,为左中右结构。相应位置可插入组件,可以很方便地应对特定的条目,相比ListTile而言,属性较少。","image":"assets/images/widgets/GridTileBar.png"},{"id":21,"family":0,"name":"GridTile","nameCN":"网格瓦片","linkWidget":"20","lever":3,"info":"Flutter提供的一个通用列表条目结构,可指定头、尾、子组件,常用于网格列表。","image":"assets/images/widgets/GridTile.png"},{"id":22,"family":0,"name":"UserAccountsDrawerHeader","nameCN":"展示头","linkWidget":"154","lever":3.8,"info":"Flutter提供的一个通用展示结构,相应位置可插入组件,可以很方便地应对特定的条目,常用于Drawer中。","image":"assets/images/widgets/UserAccountsDrawerHeader.png"},{"id":23,"family":0,"name":"MaterialButton","nameCN":"材料按钮","linkWidget":"25,26,27,326,175","lever":4,"info":"基于RawMaterialButton实现的通用Material按钮。可盛放一个子组件,能定义颜色、形状等表现,可接收点击和长按事件。","image":""},{"id":24,"family":1,"name":"CupertinoButton","nameCN":"iOS按钮","linkWidget":"23","lever":3,"info":"iOS风格的按钮。可指定颜色、点击时透明度、内边距、圆角等。可接收点击事件。","image":""},{"id":25,"family":0,"name":"FlatButton","nameCN":"平按钮","linkWidget":"24,26,27,175","lever":3,"info":"无阴影的平按钮,基于MaterialButton实现,所有属性和MaterialButton类似。","image":""},{"id":26,"family":0,"name":"RaisedButton","nameCN":"浮起按钮","linkWidget":"24,25,27,175","lever":3,"info":"有阴影的浮起按钮,基于MaterialButton实现,所有属性和MaterialButton类似。","image":""},{"id":27,"family":0,"name":"OutlineButton","nameCN":"线框按钮","linkWidget":"23,24,25,175","lever":3,"info":"边框样式按钮,基于MaterialButton实现,所有属性和MaterialButton类似。","image":""},{"id":28,"family":0,"name":"FloatingActionButton","nameCN":"浮动按钮","linkWidget":"64","lever":4,"info":"浮动按钮,一般用于Scaffold中,可摆放在特定位置。可盛放一个子组件,接收点击、可定义颜色、形状等。","image":""},{"id":29,"family":0,"name":"ButtonBar","nameCN":"按钮栏","linkWidget":"","lever":3,"info":"接收组件列表,常用于盛放若干个按钮。可指定对齐方式、边距等信息。","image":""},{"id":30,"family":0,"name":"IconButton","nameCN":"图标按钮","linkWidget":"6","lever":2,"info":"可点击的图标按钮,可指定图标信息、内边距、大小、颜色等,接收点击事件。","image":""},{"id":31,"family":0,"name":"BackButton","nameCN":"返回按钮","linkWidget":"30","lever":1,"info":"一个具有返回功能的IconButton,返回图标不可更改。在iOS和Android中表现不同","image":""},{"id":32,"family":0,"name":"CloseButton","nameCN":"关闭按钮","linkWidget":"30","lever":1.0,"info":"一个具有关闭功能的IconButton,关闭图标不可更改。","image":""},{"id":33,"family":0,"name":"ToggleButtons","nameCN":"切换按钮组","linkWidget":"332,262","lever":4,"info":"接收组件列表,可指定边线、圆角、颜色等属性。根据具体逻辑,可以实现多个按钮单选或多选的需求。","image":""},{"id":34,"family":0,"name":"Divider","nameCN":"水平分割线","linkWidget":"35,329","lever":2,"info":"水平分割线,可指定颜色、高度、粗细、左右边距信息,常用与列表的item分割线。","image":""},{"id":35,"family":0,"name":"VerticalDivider","nameCN":"竖直分割线","linkWidget":"34,329","lever":2,"info":"竖直分割线,可指定颜色、宽度、粗细、上下边距信息,常用与列表的item分割线。","image":""},{"id":36,"family":0,"name":"Placeholder","nameCN":"占位组件","linkWidget":"","lever":1,"info":"一个矩形和叉叉的占位组件,可指定颜色、线宽、宽高等属性。","image":""},{"id":37,"family":0,"name":"GridPager","nameCN":"网格线组件","linkWidget":"","lever":2,"info":"可容纳一个组件,在其上绘制网格。可指定颜色、线宽、间距等属性。","image":""},{"id":38,"family":1,"name":"Image","nameCN":"图片组件","linkWidget":"8,87","lever":5,"info":"用于显示一张图片,可以从文件、内存、网络、资源里加载。可以指定适应方式、样式、颜色混合模式、重复模式等","image":""},{"id":39,"family":1,"name":"Checkbox","nameCN":"复选框","linkWidget":"17","lever":4,"info":"复选框组件,常用于配置的切换,可指定颜色,接收状态变化回调,也可指定三态。","image":""},{"id":40,"family":1,"name":"Switch","nameCN":"切钮","linkWidget":"41,18","lever":4,"info":"切换选钮,常用于配置的切换,可指定小圆颜色、图片,滑槽颜色等,接收状态变化回调。","image":""},{"id":41,"family":1,"name":"CupertinoSwitch","nameCN":"iOS切钮","linkWidget":"40","lever":3,"info":"iOS风格的切换选钮,常用于配置的切换,可指定颜色,接收状态变化回调。","image":""},{"id":42,"family":1,"name":"Slider","nameCN":"滑块","linkWidget":"43,44,331","lever":4,"info":"滑块组件,可以在指定的最大值和最小值之间拖动选择。可指定颜色、分段数及显示的标签,接收进度变化回调。","image":""},{"id":43,"family":1,"name":"CupertinoSlider","linkWidget":"42","nameCN":"iOS滑块","lever":3,"info":"iOS风格的滑块组件,可以在指定的最大值和最小值之间拖动选择。可指定颜色,接收进度变化回调。","image":""},{"id":44,"family":1,"name":"RangeSlider","nameCN":"范围滑块","linkWidget":"42","lever":4,"info":"范围滑块组件,支持两点拖动,获取之间的范围。可指定颜色、分段数及显示的标签,接收进度变化回调。","image":""},{"id":45,"family":1,"name":"Radio","nameCN":"选钮","linkWidget":"19","lever":4,"info":"由于选中和未选择状态的圆钮,多个Radio根据逻辑可以实现单选或多选的需求。可指定颜色,接收状态变化回调。","image":""},{"id":46,"family":1,"name":"CircularProgressIndicator","nameCN":"圆形进度","linkWidget":"47,48","lever":3,"info":"圆形的进度显示,可指定颜色、线宽、进度等属性。value为null时会不停旋转。","image":""},{"id":47,"family":1,"name":"LinearProgressIndicator","nameCN":"水平进度","linkWidget":"46,48","lever":3,"info":"直线型的进度显示,可指定颜色、进度等属性。value为null时会不停旋转。","image":""},{"id":48,"family":1,"name":"CupertinoActivityIndicator","nameCN":"iOS指示器","linkWidget":"46,47","lever":2,"info":"iOS样式的loading显示组件,可指定半径和是否旋转。","image":""},{"id":49,"family":1,"name":"RefreshIndicator","nameCN":"刷新指示器","linkWidget":"","lever":4,"info":"内部嵌套可滑动区域,下滑时会显示刷新图标,松手后可以执行指定的异步方法。可指定颜色、到顶端距离等属性。","image":""},{"id":50,"family":1,"name":"Tooltip","nameCN":"提示工具","linkWidget":"","lever":3,"info":"由于显示提示信息的组件,长按时显示信息。可指定边距、显示时长、文字样式、装饰灯属性。","image":""},{"id":51,"family":1,"name":"ExpandIcon","nameCN":"展开图标","linkWidget":"66,125","lever":1,"info":"一个展开按钮,点击时会自己执行旋转180的动画。可指定颜色、大小、边距,接收点击事件。","image":""},{"id":52,"family":1,"name":"ExpansionTile","nameCN":"展开瓦片","linkWidget":"178","lever":3,"info":"一个通用的展开栏,可在指定的部位安放组件,点击时会折叠显隐下方组件。接收折叠时事件。","image":""},{"id":53,"family":1,"name":"SelectableText","nameCN":"可选择文字","linkWidget":"2","lever":3,"info":"可选择的文字,可以选择、复制。可指定浮标的颜色、大小、文字样式、对齐方式等。","image":""},{"id":54,"family":1,"name":"TextField","nameCN":"输入框","linkWidget":"199","lever":5,"info":"由于输入的组件,拥有复杂的属性。可指定控制器、文字样式、装饰线、行数限制、游标样式等。接收输入变化、完成输入等事件。","image":""},{"id":55,"family":1,"name":"DropdownButton","nameCN":"下拉按钮","linkWidget":"181","lever":4,"info":"用于下拉选择的按钮,可指定图标、影深、提示等属性,接收选中变化的事件。","image":""},{"id":56,"family":1,"name":"PopupMenuButton","nameCN":"菜单按钮","linkWidget":"174","lever":4,"info":"弹出菜单栏,可指定偏移、颜色、影深、形状等属性。接收item选中的事件和取消选择事件。","image":""},{"id":57,"family":1,"name":"AppBar","nameCN":"应用头栏","linkWidget":"64","lever":4,"info":"一个应用顶部栏的通用结构,可在指定的部位放置相应的组件,常用于Scaffold组件中。","image":""},{"id":58,"family":1,"name":"TabBar","nameCN":"标签栏","linkWidget":"57,59,148","lever":3,"info":"可滑动和点击标签栏,通常用于AppBar的底部,可与TabBarView联用,实现滑页的效果。","image":""},{"id":59,"family":1,"name":"TabBarView","nameCN":"标签页","linkWidget":"58","lever":2,"info":"通常与TabBar联用,实现滑页的效果。一般不单独使用。","image":""},{"id":60,"family":1,"name":"BottomNavigationBar","nameCN":"底部导航","linkWidget":"61","lever":4,"info":"一个底部导航栏,通常用于Scaffold组件的底部,可指定颜色和模式,接受点击回调,可与PageView实现切页效果。","image":""},{"id":61,"family":1,"name":"BottomAppBar","nameCN":"底部导航","linkWidget":"60","lever":4,"info":"一个可凹嵌的底部导航栏,通常用于Scaffold组件的底部,可指定颜色、影深、形状等属性,可与PageView实现切页效果。","image":""},{"id":62,"family":1,"name":"CupertinoNavigationBar","nameCN":"iOS导航","linkWidget":"","lever":3,"info":"一个iOS风格的应用顶部栏的通用结构,可在指定的部位放置相应的组件。可指定背景色、间距、边线等属性。","image":""},{"id":63,"family":1,"name":"CupertinoTabBar","nameCN":"iOS页签","linkWidget":"158","lever":3,"info":"一个iOS风格的TabBar,通常用于CupertinoTabScaffold。可指定颜色、图标大小、边线等数据。接收item的点击事件。","image":""},{"id":64,"family":1,"name":"Scaffold","nameCN":"脚手架","linkWidget":"57,60,61","lever":4,"info":"一个通用app结构,包括上、下、左、右、中、浮动按钮部位,对应位置可盛放组件。","image":""},{"id":65,"family":1,"name":"MaterialApp","nameCN":"Material应用","linkWidget":"64","lever":5,"info":"Material应用的顶级组件,包含路由生成器、主题、语言、主页等属性。","image":""},{"id":66,"family":2,"name":"ClipOval","nameCN":"椭圆裁剪","linkWidget":"67,68,69","lever":3,"info":"可容纳一个子组件,并将其以宽高为长轴和短轴进行椭圆裁切。","image":""},{"id":67,"family":2,"name":"ClipRect","nameCN":"矩形裁剪","linkWidget":"66,68,69","lever":3,"info":"可容纳一个子组件,并将其进行矩形裁切。可借助SizedBox、Align、AspectRadio等限定组件进行定域。","image":""},{"id":68,"family":2,"name":"ClipRRect","nameCN":"圆角矩形裁剪","linkWidget":"66,67,69","lever":3,"info":"可容纳一个子组件,并将其进行圆角矩形裁剪。指定borderRadius作为边角半径。","image":""},{"id":69,"family":2,"name":"ClipPath","nameCN":"路径裁剪","linkWidget":"66,67,68","lever":5,"info":"可容纳一个子组件,并将其按指定路径进行裁剪。可以自定义路径形状,是一个很灵活的裁剪组件。","image":""},{"id":70,"family":2,"name":"DecoratedBox","nameCN":"装饰盒","linkWidget":"1","lever":4,"info":"可容纳一个子组件,可将其进行装饰。核心属性为decoration,可设置边线、渐变、阴影、背景图等。","image":""},{"id":71,"family":2,"name":"Offstage","nameCN":"消失组件","linkWidget":"10","lever":3,"info":"可容纳一个子组件,可更改其的消失与否。offstage属性为true表示隐藏。","image":""},{"id":72,"family":2,"name":"RotatedBox","nameCN":"旋转盒","linkWidget":"90","lever":2,"info":"可容纳一个子组件,将其沿顺时针旋转quarterTurns*90°。","image":""},{"id":73,"family":2,"name":"Opacity","nameCN":"透明化","linkWidget":"89,118","lever":3,"info":"可容纳一个子组件,将其透明度变为opacity值, opacity在0~1之间。","image":""},{"id":74,"family":2,"name":"Padding","nameCN":"边距组件","linkWidget":"1,191","lever":4,"info":"可容纳一个子组件,添加自身内边距来限制孩子组件的占位,核心属性为padding。","image":""},{"id":75,"family":2,"name":"Baseline","nameCN":"基线组件","linkWidget":"2","lever":2,"info":"可容纳一个子组件,通过控制基线高度来控制子组件的位置。一般用于文字组件。","image":""},{"id":76,"family":2,"name":"SizedBox","nameCN":"定尺寸盒","linkWidget":"1","lever":4,"info":"可容纳一个子组件,通过指定宽高限定子组件容身区域。","image":""},{"id":77,"family":2,"name":"AspectRatio","nameCN":"比例盒","linkWidget":"82","lever":3,"info":"可容纳一个子组件,通过指定宽高比aspectRatio,来限定子组件容身区域。","image":""},{"id":78,"family":2,"name":"Transform","nameCN":"变换","linkWidget":"1","lever":4,"info":"可容纳一个子组件,可以通过一个4*4的变换矩阵对子组件进行变换。","image":""},{"id":79,"family":2,"name":"LimitedBox","nameCN":"限制盒","linkWidget":"80","lever":3,"info":"可容纳一个子组件,通过指定最大宽高来限定子组件容身区域。","image":""},{"id":80,"family":2,"name":"ConstrainedBox","nameCN":"约束盒","linkWidget":"1,79,81","lever":3,"info":"可容纳一个子组件,通过指定最大、最小宽高,来限定子组件容身区域。","image":""},{"id":81,"family":2,"name":"UnconstrainedBox","nameCN":"约束盒","linkWidget":"80","lever":3,"info":"可容纳一个子组件,并解除该组件的所有区域约束,展现自我尺寸。","image":""},{"id":82,"family":2,"name":"FractionallySizedBox","nameCN":"分率盒","linkWidget":"77","lever":3,"info":"可容纳一个子组件,指定宽高分率,限定子组件区域为父容器宽高*各分率,及对齐方式alignment。","image":""},{"id":83,"family":2,"name":"OverflowBox","nameCN":"溢出盒","linkWidget":"84","lever":4,"info":"可容纳一个子组件,且子组件允许溢出父组件区域,可以指定宽高的最大最小区域进行限定,拥有对齐属性alignment。","image":""},{"id":84,"family":2,"name":"SizedOverflowBox","nameCN":"尺寸溢出盒","linkWidget":"83","lever":2.8,"info":"可容纳一个子组件,且子组件允许溢出父组件区域,可以通过size属性对子组件进行偏移,拥有对齐属性alignment。","image":""},{"id":85,"family":2,"name":"Align","nameCN":"对齐组件","linkWidget":"1,86,111,120","lever":5,"info":"可容纳一个子组件,可以通过alignment让子组件,定位在父组件宽高的任何指定分率出。","image":""},{"id":86,"family":2,"name":"Center","nameCN":"居中组件","linkWidget":"85","lever":3,"info":"可容纳一个子组件,并使其居中于父组件,是Align组件的一种精简模式。","image":""},{"id":87,"family":2,"name":"FittedBox","nameCN":"适应盒","linkWidget":"38","lever":4,"info":"可容纳一个子组件,使用fit属性决定子组件区域相当于父组件的适应模式,拥有对齐属性alignment。","image":""},{"id":88,"family":2,"name":"ColorFiltered","nameCN":"滤色器","linkWidget":"277,38","lever":5,"info":"可容纳一个子组件,可以并将组件按照29中叠色模式和任意组件混合,强大到我不知道该说什么好。app一键全灰了解一下。","image":""},{"id":89,"family":2,"name":"FadeTransition","nameCN":"透明变换","linkWidget":"73,118","lever":3,"info":"可容纳一个子组件,并使其进行透明度渐变动画,需要提供动画器opacity。","image":""},{"id":90,"family":1,"name":"RotationTransition","nameCN":"旋转变换","linkWidget":"72","lever":3,"info":"可容纳一个子组件,并使其进行旋转动画,需要提供动画器turns,拥有alignment属性。","image":""},{"id":91,"family":1,"name":"ScaleTransition","nameCN":"缩放变换","linkWidget":"","lever":3,"info":"可容纳一个子组件,并使其进行缩放动画,需要提供动画器scale,拥有alignment属性。","image":""},{"id":92,"family":1,"name":"SizeTransition","nameCN":"尺寸变换","linkWidget":"201","lever":3,"info":"可容纳一个子组件,并使其进行尺寸动画,需要提供动画器sizeFactor,可指定尺寸变化轴及轴向的axisAlignment。","image":""},{"id":93,"family":1,"name":"PositionedTransition","nameCN":"位置变换","linkWidget":"97","lever":3,"info":"只能用于Stack中,可容纳一个子组件,让其在两个矩形间进行位置动画,需要提供动画器rect。","image":""},{"id":94,"family":3,"name":"Flex","nameCN":"弹性布局","linkWidget":"95,96,106,107,109","lever":5,"info":"Row和Column的父类,Flutter中最强大的布局方式。可容纳多个组件,可与Spacer、Expended、Flexible组件联用进行灵活布局","image":""},{"id":95,"family":3,"name":"Row","nameCN":"行布局","linkWidget":"94,96","lever":4,"info":"排布方向为横向的Flex布局,可容纳多个组件。其他属性全部一致,详见Flex。","image":""},{"id":96,"family":3,"name":"Column","nameCN":"列布局","linkWidget":"94,95","lever":4,"info":"排布方向为竖向的Flex布局,可容纳多个组件。其他属性全部一致,详见Flex。","image":""},{"id":97,"family":3,"name":"Stack","nameCN":"堆叠布局","linkWidget":"94,95,161","lever":5,"info":"可容纳多个组件,以堆叠的方式摆放子组件,后者居上。拥有alignment属性,可与Positioned组件联合使用,精确定位。","image":""},{"id":98,"family":3,"name":"Wrap","nameCN":"包裹布局","linkWidget":"94,95","lever":5,"info":"可容纳多个组件,按照指定方向依次排布,可以很方便处理孩子的间距,当越界时可以自动换行。拥有主轴和交叉轴的对齐方式,比较灵活。","image":""},{"id":99,"family":3,"name":"Flow","nameCN":"流动布局","linkWidget":"98,94","lever":5,"info":"可容纳多个组件, 需要自己制定排布的代理,可以高强度自定义组件的排布,实现普通布局无法达到的效果。布局王者,当之无愧。","image":""},{"id":100,"family":1,"name":"AnimatedCrossFade","nameCN":"组件切换","linkWidget":"116","lever":5,"info":"将两个组件切换时呈现动画效果,可指定动画曲线、时长、对齐方式等属性。是一个非常有用的组件。","image":""},{"id":101,"family":3,"name":"RichText","nameCN":"富文本","linkWidget":"2","lever":5,"info":"可以容纳多种文字样式或各种组件的富文本组件,应用较为广泛。","image":""},{"id":102,"family":0,"name":"DataTable","nameCN":"数据表格","linkWidget":"110","lever":3,"info":"一个表格组件,可以制订逻辑进行点击、修改、排序等操作。","image":""},{"id":103,"family":1,"name":"Draggable","nameCN":"可拖拽组件","linkWidget":"104,105","lever":4,"info":"可以让组件在界面上任意拖拽,可存放一个泛型T的数据。通常和DragTarget组合使用,来完成拖拽效果。","image":""},{"id":104,"family":1,"name":"DragTarget","nameCN":"拖拽目标","linkWidget":"103,105","lever":4,"info":"一个拖拽的目标区域,可接收Draggable组件的信息。可以获取拖拽时的回调。","image":""},{"id":105,"family":1,"name":"LongPressDraggable","nameCN":"拖拽目标","linkWidget":"103,104","lever":4,"info":"长按时让组件在界面上任意拖拽,可存放一个泛型T的数据。通常和DragTarget组合使用,来完成拖拽效果。","image":""},{"id":106,"family":5,"name":"Expanded","nameCN":"延展组件","linkWidget":"94,109","lever":4,"info":"父类是Flexible,相当于一个fit类型为tight的Flexible组件。可嵌套孩子利用剩余空间对占位空间进行延展。","image":""},{"id":107,"family":0,"name":"Spacer","nameCN":"空间组件","linkWidget":"94","lever":3,"info":"只能用于Row、Column和Flex布局中,可利用剩余空间进行占位,使用flex属性可以给多个Spacer按比例分配空间。","image":""},{"id":108,"family":5,"name":"Positioned","nameCN":"定位组件","linkWidget":"97,159,121","lever":3,"info":"只能用于Stack中,可以指定左上右下的距离对某个组件进行位置精确安放。","image":""},{"id":109,"family":5,"name":"Flexible","nameCN":"灵活组件","linkWidget":"94,106","lever":3,"info":"只能用于只能用于Row、Column和Flex布局中,可嵌套孩子利用剩余空间对占位空间进行延展,也可指定适应类型。","image":""},{"id":110,"family":6,"name":"Table","nameCN":"表格组件","linkWidget":"102","lever":4,"info":"用于展示表格的组件,可指定边线、列宽、文字方向等属性,核心对象类型是TableRow。","image":""},{"id":111,"family":1,"name":"AlignTransition","nameCN":"对齐变换","linkWidget":"85,120","lever":3,"info":"AnimatedWidget的子类,使用Alignment类型的动画器让子组件在两个Alignment对象之间进行过渡动画。","image":""},{"id":112,"family":1,"name":"SlideTransition","nameCN":"滑动变换","linkWidget":"","lever":3,"info":"AnimatedWidget的子类,使用Offset类型的动画器让子组件在两个Offset对象之间进行过渡动画。","image":""},{"id":113,"family":1,"name":"DecoratedBoxTransition","nameCN":"装饰变换","linkWidget":"70","lever":3,"info":"AnimatedWidget的子类,使用Decorated类型的动画器让子组件在两个Decorated对象之间进行过渡动画。","image":""},{"id":114,"family":1,"name":"DefaultTextStyleTransition","nameCN":"文字样式变换","linkWidget":"124,324","lever":3,"info":"AnimatedWidget的子类,使用TextStyle类型的动画器让文字组件在两个TextStyle对象之间进行过渡动画。","image":""},{"id":115,"family":1,"name":"RelativePositionedTransition","nameCN":"矩形位置变换","linkWidget":"70","lever":3,"info":"AnimatedWidget的子类,使用Rect类型的动画器让子组件在两个Rect对象之间进行过渡动画。","image":""},{"id":116,"family":1,"name":"AnimatedSwitcher","nameCN":"动画切换","linkWidget":"100","lever":4,"info":"当子组件变化时执行动画,需要指定子组件的key进行标识。动画方式可以自定义,能指定动画时长、动画曲线等属性。","image":""},{"id":117,"family":1,"name":"AnimatedList","nameCN":"动画列表","linkWidget":"162","lever":3,"info":"强化版的ListView,可以对item进行动画处理。比如在添加、删除是item的动画。","image":""},{"id":118,"family":1,"name":"AnimatedOpacity","nameCN":"透明动画","linkWidget":"89,73","lever":3,"info":"能让子组件进行Opacity(透明度)动画,可指定时长和曲线,有动画结束事件。","image":""},{"id":119,"family":1,"name":"AnimatedPadding","nameCN":"边距动画","linkWidget":"74","lever":3,"info":"能让子组件进行Padding(内边距)动画,可指定时长和曲线,有动画结束事件。","image":""},{"id":120,"family":1,"name":"AnimatedAlign","nameCN":"对齐动画","linkWidget":"85,111","lever":3,"info":"能让子组件进行Align(对齐)动画,可指定时长和曲线,有动画结束事件。","image":""},{"id":121,"family":1,"name":"AnimatedPositioned","nameCN":"定位动画","linkWidget":"108,93,122","lever":3,"info":"能让子组件进行Positioned(定位)动画,可指定时长和曲线,有动画结束事件。只能用于Stack之中。","image":""},{"id":122,"family":1,"name":"AnimatedPositionedDirectional","nameCN":"方向定位动画","linkWidget":"121,159","lever":3,"info":"能让子组件进行PositionedDirectional(方向定位)动画,可指定时长和曲线,有动画结束事件。只能用于Stack之中。","image":""},{"id":123,"family":1,"name":"AnimatedContainer","nameCN":"容器动画","linkWidget":"1","lever":5,"info":"集合alignment、padding、color、decoration、width、height、constraints、margin、transform于一身,这些属性皆可动画,可指定时长和曲线,有动画结束事件。","image":""},{"id":124,"family":1,"name":"AnimatedDefaultTextStyle","nameCN":"容器动画","linkWidget":"114,324","lever":3,"info":"能让子文字组件进行TextStyle(文字样式)动画,可指定时长和曲线,有动画结束事件。","image":""},{"id":125,"family":0,"name":"AnimatedIcon","nameCN":"图标动画","linkWidget":"6","lever":3,"info":"使用AnimatedIcons的图标数据,可以根据一个动画控制器来使图标进行动画效果。可指定图标大小、颜色等。","image":""},{"id":126,"family":0,"name":"Dialog","nameCN":"对话框","linkWidget":"","lever":2,"info":"最简易的对话框面板,包含一个内容组件,可指定影深、背景色、形状等属性。","image":""},{"id":127,"family":0,"name":"AlertDialog","nameCN":"弹出对话框","linkWidget":"129","lever":3,"info":"一个通用的对话框结构,可指定头、中、尾处的组件。拥有标题、内容的文字样式和边距,影深、形状等属性。","image":""},{"id":128,"family":0,"name":"SimpleDialog","nameCN":"简单对话框","linkWidget":"133","lever":3,"info":"一个简单的对话框结构,可指定头、中处的组件。拥有拥有标题、内容的文字样式和边距,影深、形状等属性。常与SimpleDialogOption联用。","image":""},{"id":129,"family":0,"name":"CupertinoAlertDialog","nameCN":"iOS对话框","linkWidget":"127","lever":3,"info":"iOS风格的通用的对话框结构,可指定头、中、尾处的组件。","image":""},{"id":130,"family":0,"name":"AboutDialog","nameCN":"弹出对话框","linkWidget":"193","lever":1,"info":"应用的简介对话框,可指定应用图标、应用名、应用版本号等信息和内部的子组件列表,点击左侧按钮可以跳转到证书页。","image":""},{"id":131,"family":0,"name":"CupertinoActionSheet","nameCN":"iOS行为单","linkWidget":"132","lever":3,"info":"iOS风格的弹出选择结构,可放多的按钮,一般与CupertinoActionSheetAction联用。","image":""},{"id":132,"family":0,"name":"CupertinoActionSheetAction","nameCN":"iOS行为单按键","linkWidget":"131","lever":1,"info":"一个按钮,应用场景很少,通常用于CupertinoActionSheet中,接收点击事件。","image":""},{"id":133,"family":0,"name":"SimpleDialogOption","nameCN":"简单对话框选项","linkWidget":"128","lever":1,"info":"一个按钮,应用场景很少,通常用于SimpleDialog中,接收点击事件。","image":""},{"id":134,"family":0,"name":"DayPicker","nameCN":"日期选择器","linkWidget":"135,136","lever":3,"info":"日期的选择组件,可指定当前日期、选中日期、展示月份等,接收日期选中事件。","image":""},{"id":135,"family":1,"name":"MonthPicker","nameCN":"月份选择器","linkWidget":"134,136","lever":3,"info":"月份的选择组件,自带上下月切换的监听。可指定选择的日期范围、选中日期等,接收日期选中事件。","image":""},{"id":136,"family":1,"name":"YearPicker","nameCN":"年份选择器","linkWidget":"134,135","lever":3,"info":"年份的选择组件,长相比较寒酸。可指定选择的日期范围、选中日期等,接收每份选中事件","image":""},{"id":137,"family":1,"name":"CupertinoDatePicker","nameCN":"iOS日期选择器","linkWidget":"138","lever":3,"info":"高大上的滑滚日期选择器,可指定选择的类型、日期范围等,接收日期选中事件。","image":""},{"id":138,"family":1,"name":"CupertinoTimerPicker","nameCN":"iOS时间选择器","linkWidget":"137","lever":3,"info":"高大上的滑滚时间选择器,可指定选择的类型、初始时间、背景色等,接收时间选中事件。","image":""},{"id":139,"family":1,"name":"CupertinoPicker","nameCN":"iOS选择器","linkWidget":"179","lever":3,"info":"高大上的柱面滑动选择器,精妙十足,可指定很多配置属性,接收滑动时选中事件。","image":""},{"id":140,"family":1,"name":"SnackBar","nameCN":"信息提示条","linkWidget":"141,142","lever":4,"info":"作为组件来说是一个简单的结构组件,可指定形状、影深、背景色等。一般通过ScaffoldState的showSnackBar方法从底部弹出。","image":""},{"id":141,"family":1,"name":"SnackBarAction","nameCN":"信息提示条按钮","linkWidget":"140","lever":1,"info":"一般只用于SnackBar中,接受点击事件。点击一次后该按钮就会被禁用,可以指定颜色和禁用时颜色。","image":""},{"id":142,"family":1,"name":"BottomSheet","nameCN":"底部抽屉","linkWidget":"140","lever":4,"info":"作为组件来说是一个简单的结构组件,可指定形状、影深、背景色、内部组件构造器等。一般通过ScaffoldState的showBottomSheet方法从底部弹出。","image":""},{"id":143,"family":1,"name":"CupertinoContextMenu","nameCN":"ios弹出菜单","linkWidget":"144","lever":5,"info":"一个华丽的iOS风格按钮弹出框,长按时会以动画的形式弹出菜单面板,通常和CupertinoContextMenuAction联用。","image":""},{"id":144,"family":1,"name":"CupertinoContextMenuAction","nameCN":"ios弹出菜单按钮","linkWidget":"143","lever":1,"info":"一般只用于CupertinoContextMenu中的点击按钮。可指定孩子和尾部图标,接收点击事件。","image":""},{"id":145,"family":1,"name":"LicensePage","nameCN":"证书页","linkWidget":"130,193","lever":1,"info":"应用的证书页,可指定应用图标、应用名、应用版本号等信息,其他由Flutter自动生成。","image":""},{"id":146,"family":0,"name":"GestureDetector","nameCN":"手势监听器","linkWidget":"147,150","lever":5,"info":"组件手势事件的检测器,可接受点击、长按、双击,按下、松开、移动等事件,并可以获取触点信息,居家旅行必备组件。","image":""},{"id":147,"family":0,"name":"Listener","nameCN":"事件监听器","linkWidget":"146","lever":3,"info":"组件事件的监听器,可接受按下、松开、移动、取消等事件。较GestureDetector比较原始,可获取的信息也更多。","image":""},{"id":148,"family":0,"name":"Tab","nameCN":"标签","linkWidget":"58","lever":1,"info":"一般用于TabBar中的item,上下结构,可指定图标和一个内容组件。","image":""},{"id":149,"family":1,"name":"InkResponse","nameCN":"水波纹响应","linkWidget":"150,152","lever":1,"info":"水波纹的点击效果,接收点击、双击、长按、取消、高亮变化事件,可指定水波纹颜色、半径、高亮形状等属性。","image":""},{"id":150,"family":1,"name":"InkWell","nameCN":"水波纹","linkWidget":"149,152","lever":4,"info":"InkResponse的子类,基本属性同InkResponse。一个矩形区域的水波纹,可以知道圆角半径,边线形状等。","image":""},{"id":151,"family":1,"name":"TableRowInkWell","nameCN":"表格水波纹","linkWidget":"110","lever":1,"info":"只能用于Table的水波纹,接收点击、双击、长按、高亮变化事件,水波纹会作用于表格的一行。","image":""},{"id":152,"family":1,"name":"Ink","nameCN":"水波","linkWidget":"149,150","lever":3,"info":"使InkWell和InkResponse的水波纹有效,用于绘制图像或其他装饰的Material组件。","image":""},{"id":153,"family":1,"name":"RawChip","nameCN":"原生小条","linkWidget":"11,12,13,14,15","lever":5,"info":"各自Chip组件的始祖,拥有各自Chip表现的能力,支持选中、点击、删除等事件。详见Chip、FilterChip、ActionChip、InputChip、ChoiceChip。","image":""},{"id":154,"family":0,"name":"Drawer","nameCN":"滑页栏","linkWidget":"64,155","lever":2,"info":"一般用于Scaffold中的draw和endDraw属性作为左右的滑页栏,可以容纳一个子组件,能指定影深。","image":""},{"id":155,"family":0,"name":"DrawerHeader","nameCN":"滑页栏","linkWidget":"154","lever":2,"info":"一般用于Drawer中,作为滑页栏的头部。可以指定内外边距、装饰、子组件等属性。","image":""},{"id":156,"family":1,"name":"CupertinoApp","nameCN":"iOS应用","linkWidget":"157,158","lever":4,"info":"iOS风格应用的顶级组件,包含路由生成器、主题、语言、主页等属性。","image":""},{"id":157,"family":1,"name":"CupertinoPageScaffold","nameCN":"iOS页面脚手架","linkWidget":"62","lever":3,"info":"iOS风格的页面布局脚手架结构,可指定顶部的导航栏和页面背景色。","image":""},{"id":158,"family":1,"name":"CupertinoTabScaffold","nameCN":"iOS页签脚手架","linkWidget":"63","lever":3,"info":"iOS风格的页面布局脚手架结构,可指定最底部的导航切换栏可主体内容页。","image":""},{"id":159,"family":0,"name":"PositionedDirectional","nameCN":"方向定位","linkWidget":"108,122","lever":3,"info":"和Positioned组件功能一样,属性名不同。只能用于Stack中,可以指定左上右下的距离对某个组件进行位置精确安放。","image":""},{"id":160,"family":1,"name":"Material","nameCN":"材料组件","linkWidget":"3","lever":5,"info":"Material风格组件的领军人物,灵魂核心。可指定颜色、影深、类型、阴影颜色、形状等属性。","image":""},{"id":161,"family":3,"name":"IndexedStack","nameCN":"索引堆叠","linkWidget":"97","lever":4,"info":"Stack组件的子类,可以堆叠多个组件,并通过index来指定展示的组件索引,其余的会被隐藏。","image":""},{"id":162,"family":0,"name":"ListView","nameCN":"列表组件","linkWidget":"16,163","lever":5,"info":"列表显示的领军人物,容纳多个子组件,可以通过builder、separated、custom等构造。有内边距、是否反向、滑动控制器等属性。","image":""},{"id":163,"family":0,"name":"GridView","nameCN":"网格组件","linkWidget":"21,162","lever":5,"info":"容纳多个组件,并以网格的方式。可以通过count、extent、custom、builder等构造。有内边距、是否反向、滑动控制器等属性。","image":""},{"id":164,"family":0,"name":"SingleChildScrollView","nameCN":"单子滑动","linkWidget":"","lever":5,"info":"使一个组件具有滑动的效果,可指定滑动的方向、是否反向、滑动控制器等属性。","image":""},{"id":165,"family":0,"name":"PageView","nameCN":"滑页","linkWidget":"","lever":5,"info":"容纳多个组件页面,可对它们进行滑动切换,可指定滑动的方向、是否反向、滑动控制器等属性。","image":""},{"id":166,"family":2,"name":"CustomPaint","nameCN":"绘制组件","linkWidget":"","lever":5,"info":"通过CustomPainter进行绘制,可实现一些复杂的自定义绘制组件,是Flutter中自定义组件的灵魂人物。","image":""},{"id":167,"family":5,"name":"MediaQuery","nameCN":"媒体查询","linkWidget":"","lever":4,"info":"可通过MediaQuery.of来获取屏幕尺寸、设备密度、文字缩放比例、边距等信息。","image":""},{"id":168,"family":0,"name":"Theme","nameCN":"主题","linkWidget":"65,169","lever":4,"info":"可通过Theme.of获取ThemeData对象。也可以指定主题应用于Theme的后代组件。","image":""},{"id":169,"family":0,"name":"CupertinoTheme","nameCN":"iOS主题","linkWidget":"156,168","lever":3,"info":"可通过CupertinoTheme.of获取CupertinoThemeData对象。也可以指定主题应用于CupertinoTheme的后代组件。","image":""},{"id":170,"family":1,"name":"WillPopScope","nameCN":"返回拦截","linkWidget":"","lever":5,"info":"当一个界面中有WillPopScope组件时,在页面返回时会触发回调,决定是否返回。可用于二次确认退出的场景。","image":""},{"id":171,"family":1,"name":"Hero","nameCN":"共享动画","linkWidget":"28","lever":5,"info":"可指定标签名,两个界面跳转时具有相同标签的组件会进行共享动画。一个界面中不能存在两个同名的Hero标签","image":""},{"id":172,"family":1,"name":"FutureBuilder","nameCN":"异步构造器","linkWidget":"173","lever":5,"info":"可指定一个Future对象,能够监听异步执行的状态,并在构造器中根据状态构建不同的界面。注意该Future对象不能和FutureBuilder同时创建,否则可能过渡刷新。","image":""},{"id":173,"family":1,"name":"StreamBuilder","nameCN":"流构造器","linkWidget":"172","lever":5,"info":"可指定一个stream对象,能够监听异步执行的状态,并在构造器中根据状态构建不同的界面。","image":""},{"id":174,"family":1,"name":"PopupMenuDivider","nameCN":"弹出菜单分割线","linkWidget":"56,34","lever":1,"info":"PopupMenuButton的分割线,一般不单独使用,可指定高度。","image":""},{"id":175,"family":1,"name":"RawMaterialButton","nameCN":"原始按钮","linkWidget":"23,25,26,27","lever":5,"info":"原始的Material按钮,按钮界的幕后大佬,可接受点击、长按、高亮变化事件,可指定颜色、形状。影深、内边距等属性。","image":""},{"id":176,"family":1,"name":"Dismissible","nameCN":"滑动消失","linkWidget":"162","lever":4,"info":"滑动时可显示底部组件,可指定滑动的方向和交叉轴的偏移量。接收确认消失和消失时的回调。","image":""},{"id":177,"family":1,"name":"ReorderableListView","nameCN":"可重排序列表","linkWidget":"162","lever":4,"info":"可以进行长按排序的ListView,可指定滑动方向、是否反向、滑动控制器等属性。","image":""},{"id":178,"family":1,"name":"ExpansionPanelList","nameCN":"展开列表","linkWidget":"52","lever":3,"info":"可展开的列表组件,可根据逻辑来实现单展开或多展开。可指定展开动画时长,接收展开回调","image":""},{"id":179,"family":1,"name":"ListWheelScrollView","nameCN":"滚轮列表","linkWidget":"139","lever":4,"info":"高大上的柱面滑动列表,精妙十足,可指定item高度、透视、挤压等属性,接收滑动时选中事件。","image":""},{"id":180,"family":5,"name":"ScrollConfiguration","nameCN":"ios菜单按钮","linkWidget":"162,163,164","lever":3,"info":"需要包裹一个可滑动的组件,并通过behavior属性控制滑动的效果,可以去除滑动的蓝色阴影等。","image":""},{"id":181,"family":5,"name":"DropdownButtonHideUnderline","nameCN":"下拉按钮隐藏线","linkWidget":"55","lever":1,"info":"用于去除DropdownButton的下划线,本身没有什么应用价值。","image":""},{"id":182,"family":1,"name":"Overlay","nameCN":"悬浮组件","linkWidget":"","lever":5,"info":"可以将组件在全应用中进行悬浮显示,能够添加或移除组件,它们有独立管理的栈。","image":""},{"id":183,"family":4,"name":"CustomScrollView","nameCN":"通用滑动视图","linkWidget":"184,185,188","lever":5,"info":"一个通用的滑动结构,可以指定滑动方向、是否反向、滑动控制器等属性。其中包含的子组件们必须是Sliver家族。","image":""},{"id":184,"family":4,"name":"SliverAppBar","nameCN":"Sliver头部栏","linkWidget":"183,196","lever":4,"info":"Sliver家族的顶部栏通用结构,可以指定左中右组件、收缩空间、影深、固定模式、背景色等属性。","image":""},{"id":185,"family":4,"name":"SliverList","nameCN":"Sliver列表","linkWidget":"183,186,187","lever":5,"info":"Sliver家族的列表组件,通过指定delegate构造子组件。通常用于CustomScrollView中。","image":""},{"id":186,"family":4,"name":"SliverFixedExtentList","nameCN":"Sliver固定延展列表","linkWidget":"183,185,187","lever":3,"info":"Sliver家族的列表组件,通过delegate构造子组件,可以指定item的高度。通常用于CustomScrollView中。","image":""},{"id":187,"family":4,"name":"SliverFillViewport","nameCN":"Sliver填充视图列表","linkWidget":"183,185,186","lever":3,"info":"Sliver家族的列表组件,通过delegate构造子组件,item的高度会填空视口,可以指定是否的分率。","image":""},{"id":188,"family":4,"name":"SliverGird","nameCN":"Sliver网格","linkWidget":"183","lever":4,"info":"Sliver家族的网格列表组件,和GirdView类似,通过count和extent构造。通常用于CustomScrollView中。","image":""},{"id":189,"family":4,"name":"SliverToBoxAdapter","nameCN":"Sliver适配器","linkWidget":"183","lever":4,"info":"可以容纳一个普通的组件,并将其转化成Sliver家族组件的适配器。","image":""},{"id":190,"family":4,"name":"SliverPersistentHeader","nameCN":"Sliver存留头","linkWidget":"183","lever":5,"info":"通常用于CustomScrollView中,可以让一个组件在滑动中停留在顶部,不会滑动消失。","image":""},{"id":191,"family":4,"name":"SliverPadding","nameCN":"Sliver内间距","linkWidget":"74","lever":3,"info":"可容纳一个Sliver家族的子组件,添加自身内边距来限制孩子组件的占位,核心属性为padding。","image":""},{"id":192,"family":4,"name":"SliverOpacity","nameCN":"Sliver透明度","linkWidget":"73","lever":3,"info":"可容纳一个Sliver家族的子组件,并通过opacity来指定子组件的透明度。","image":""},{"id":193,"family":0,"name":"AboutListTile","nameCN":"关于应用条目","linkWidget":"130,145","lever":3,"info":"一个点击条目,点击时可以弹出应用相关信息,可指定应用图标、应用名、应用版本号等信息和内部的子组件列表。","image":""},{"id":194,"family":1,"name":"Scrollbar","nameCN":"滑动指示栏","linkWidget":"195,164,162","lever":3,"info":"需要包裹一个可滑动区域,当可滑动时,会显示滑动的bar用于指示。","image":""},{"id":195,"family":1,"name":"CupertinoScrollbar","nameCN":"iOS滑动指示栏","linkWidget":"194,164,162","lever":3,"info":"iOS风格的滑动指示栏,需要包裹一个可滑动区域,当可滑动时,会显示滑动的bar用于指示。","image":""},{"id":196,"family":4,"name":"FlexibleSpaceBar","nameCN":"ios菜单按钮","linkWidget":"184","lever":3,"info":"通常用于SliverAppBar中的可伸展区域,可指定标题、标题间距、背景、折叠模式等。","image":""},{"id":197,"family":6,"name":"ErrorWidget","nameCN":"错误组件","linkWidget":"","lever":1,"info":"用于显示一个错误信息的组件,红底黄字,在开发过程中经常看到,一般不使用。","image":""},{"id":198,"family":1,"name":"Form","nameCN":"表单组件","linkWidget":"199","lever":4,"info":"表单组件,可以接收其下的FormField组件的变化回调,通过onWillPop拦截页面返回,通过FormState可对表单字段进行保存或校验。","image":""},{"id":199,"family":1,"name":"TextFormField","nameCN":"文字表单输入","linkWidget":"54,198","lever":4,"info":"和TextField属性基本一致,在其基础上增加字段的校验和提交的回调,FormState的save会触发onSaved回调。","image":""},{"id":200,"family":1,"name":"Stepper","nameCN":"步骤组件","linkWidget":"","lever":5,"info":"步骤组件,可指定一步步的操作,可以自定义步骤的内容,确认和返回的按钮以及步骤排列的方向。","image":""},{"id":201,"family":1,"name":"AnimatedSize","nameCN":"尺寸动画","linkWidget":"92","lever":3,"info":"子组件大小发生变化是,进行动画渐变,可指定时长、对齐方式、曲线、vsync等属性。","image":""},{"id":202,"family":0,"name":"Builder","nameCN":"构造器","linkWidget":"","lever":2,"info":"一个不影响子组件占位空间,不具有显示性的组件,存在的唯一价值是提供当前组件对应元素的上下文。","image":""},{"id":203,"family":0,"name":"OrientationBuilder","nameCN":"方向构造器","linkWidget":"202","lever":2,"info":"能够回调父组件是横向还是纵向,可以据此来构建不同的子组件。","image":""},{"id":204,"family":0,"name":"PreferredSize","nameCN":"优先尺寸","linkWidget":"57,64","lever":2,"info":"实现了PreferredSizeWidget接口,可容纳一个子组件,设置优先尺寸,不会对其子组件施加任何约束。","image":""},{"id":205,"family":0,"name":"TabPageSelector","nameCN":"页签滑动选择器","linkWidget":"206,59","lever":2,"info":"通常作为指示器与TabBarView联用,共同使用一个TabController。可指定颜色、大小、选中色。","image":""},{"id":206,"family":0,"name":"TabPageSelectorIndicator","nameCN":"页签指示器","linkWidget":"205","lever":2,"info":"一个有边线的圆形组件,可指定大小、颜色、边线色。是TabPageSelector的部分之一,一般不单独使用。","image":""},{"id":208,"family":0,"name":"Title","nameCN":"应用标题","linkWidget":"65","lever":2,"info":"该组件用于描述app在操作系统中的名称,可以在应用栏列表里看到效果。MaterialApp中的title字段效果的根源是该组件。","image":""},{"id":211,"family":0,"name":"MaterialBanner","nameCN":"横幅组件","linkWidget":"","lever":2,"info":"Material风格的横幅组件,支持左中右或左中下结构,可指定边距背景色等","image":""},{"id":214,"family":0,"name":"NavigationToolbar","nameCN":"导航工具条","linkWidget":"57","lever":2,"info":"左中右模式的通用结构组件,可指定中间组件距左侧边距及是否居中。源码在AppBar等导航条结构中有使用它。","image":""},{"id":218,"family":0,"name":"CupertinoNavigationBarBackButton","nameCN":"iOS风格返回按钮","linkWidget":"57","lever":2,"info":"Cupertino风格的导航栏返回按钮,可指定颜色和点击事件,一般不单独使用。","image":""},{"id":231,"family":1,"name":"InputDecorator","nameCN":"输入装饰","linkWidget":"54","lever":2,"info":"在外层包裹输入的装饰,是TextField的底层核心组件之一,一般不单独使用。","image":""},{"id":232,"family":1,"name":"Navigator","nameCN":"导航器","linkWidget":"65","lever":4,"info":"Navigator用堆栈规则管理一组子组件,可以将子组件切入弹出及监听出入栈事件。MaterialApp路由管理的本源就是使用了Navigator。","image":""},{"id":244,"family":1,"name":"EditableText","nameCN":"可编辑文字","linkWidget":"2,54","lever":2,"info":"可以编辑的文字,是TextField的底层最核心组件,一般不单独使用。","image":""},{"id":245,"family":1,"name":"CupertinoTextField","nameCN":"iOS风格输入框","linkWidget":"54","lever":4,"info":"Cupertino风格的输入框,属性和TextField类似,可指定控制器、文字样式、装饰线、行数限制、游标样式等。接收输入变化、完成输入等事件。","image":""},{"id":251,"family":4,"name":"NestedScrollView","nameCN":"嵌套滑动视图","linkWidget":"183","lever":4,"info":"用于多个视图滑动嵌套处理,可以指定头部、滑动控制器、滑动方向等,其中body必须是可滑动类型的组件。","image":""},{"id":253,"family":1,"name":"Scrollable","nameCN":"可滑动组件","linkWidget":"340,349","lever":4,"info":"实现了一个可滚动组件的交互模型,需要viewportBuilder进的viewport的构造。是ScrollView的核心实现组件之一,一般不直接使用。","image":""},{"id":255,"family":1,"name":"ValueListenableBuilder","nameCN":"监听值构造器","linkWidget":"","lever":5,"info":"可以监听一个值,当其变化时通过builder回调能重建界面,避免使用setState刷新。","image":""},{"id":262,"family":1,"name":"CupertinoSegmentedControl","nameCN":"iOS多栏切换","linkWidget":"33","lever":4,"info":"iOS风格的多按钮栏,表现和ToggleButtons类似,可指定内边距。","image":""},{"id":263,"family":2,"name":"FractionalTranslation","nameCN":"分度偏移","linkWidget":"","lever":3,"info":"通过offset属性将子组件进行偏移,偏移量为OffSet横纵*子组件大小。","image":""},{"id":264,"family":2,"name":"RepaintBoundary","nameCN":"重绘边界","linkWidget":"166","lever":5,"info":"为子组件创建一个单独的显示列表,提升性能。源码中在TextField、DrawerController、Scrollbar、Sliver等组件中均有应用","image":""},{"id":277,"family":2,"name":"ShaderMask","nameCN":"着色器遮罩","linkWidget":"88,38","lever":4,"info":"可容纳一个孩子,并通过着色器来对孩子进行着色,可指定混色模式。通常用于组件渐变色处理。","image":""},{"id":278,"family":2,"name":"BackdropFilter","nameCN":"背景滤镜","linkWidget":"88,97,67","lever":4,"info":"可容纳一个孩子,并将背景进行模糊滤镜。可以通过Stack将背景模糊实现组件的模糊效果。","image":""},{"id":279,"family":2,"name":"PhysicalShape","nameCN":"物理形状","linkWidget":"69","lever":4,"info":"可以让子组件按照路径进行剪裁,并且可以指定背景色、影深、阴影颜色、剪切行为。","image":""},{"id":285,"family":2,"name":"CustomSingleChildLayout","nameCN":"通用单子布局","linkWidget":"341","lever":3,"info":"可容纳一个子组件,并指定代理类对子组件进行排布。代理类可获取父容器区域和子组件的区域大小,及区域约束情况。","image":""},{"id":287,"family":2,"name":"LayoutBuilder","nameCN":"布局构造器","linkWidget":"","lever":4,"info":"可以检测到父容器的区域大小,并根据父容器的尺寸信息可以完成自定义布局。是一个非常实用的布局组件。","image":""},{"id":292,"family":2,"name":"IgnorePointer","nameCN":"忽视点击","linkWidget":"295,146,149,150","lever":4,"info":"容纳一个子组件,可以通过指定ignoring属性,来决定孩子是否忽略手势事件,其本身不接受事件。","image":""},{"id":293,"family":1,"name":"MouseRegion","nameCN":"鼠标区域","linkWidget":"","lever":3,"info":"用于鼠标事件监听的组件,通常用于桌面和Web平台,可监听鼠标的移入、移除、移动事件。","image":""},{"id":295,"family":2,"name":"AbsorbPointer","nameCN":"吸收点击","linkWidget":"146,149,150,292","lever":4,"info":"容纳一个子组件,可以通过指定ignoring属性,来决定孩子是否忽略手势事件,其本身接受事件。","image":""},{"id":297,"family":2,"name":"IntrinsicWidth","nameCN":"固有宽","linkWidget":"298","lever":4,"info":"根据子元素的固有宽度度调整其子元素大小的组件,可解决很多布局的疑难杂症,但相对昂贵。","image":""},{"id":298,"family":2,"name":"IntrinsicHeight","nameCN":"固有高","linkWidget":"297","lever":4,"info":"根据子元素的固有高度调整其子元素大小的组件,可解决很多布局的疑难杂症,但相对昂贵。","image":""},{"id":307,"family":4,"name":"SliverOverlapAbsorber","nameCN":"重叠吸收器","linkWidget":"251,308","lever":3,"info":"包裹另一个的sliver,并迫使其布局范围被视为重叠。需要和SliverOverlapInjector联用。","image":""},{"id":308,"family":4,"name":"SliverOverlapInjector","nameCN":"重叠注射器","linkWidget":"251,307","lever":3,"info":"一个sliver,需要和SliverOverlapAbsorber联用,处理视图重叠问题。","image":""},{"id":312,"family":6,"name":"PerformanceOverlay","nameCN":"性能浮层","linkWidget":"65","lever":2,"info":"可以非常方便地开启性能监测的两个柱图,方便查看刷新界面时帧率的变化情况。","image":""},{"id":313,"family":6,"name":"RawImage","nameCN":"原图片","linkWidget":"38","lever":2,"info":"是实现Image组件的核心组件,可以显示ui的Image,基本属性同Image,一般很少单独使用。","image":""},{"id":315,"family":5,"name":"LayoutId","nameCN":"布局Id","linkWidget":"341","lever":2,"info":"只能用于CustomMultiChildLayout组件中,为其子组件标识身份。","image":""},{"id":324,"family":5,"name":"DefaultTextStyle","nameCN":"默认字体样式","linkWidget":"2,114,124","lever":3,"info":"可容纳一个孩子,为后代的文字指定默认样式。常用于多个相同文字的样式统一,避免一一设置。","image":""},{"id":325,"family":5,"name":"IconTheme","nameCN":"图标样式","linkWidget":"6","lever":3,"info":"可容纳一个孩子,为后代的图标指定默认样式。常用于多个相同图标的样式统一,避免一一设置。","image":""},{"id":326,"family":5,"name":"ButtonTheme","nameCN":"按钮样式","linkWidget":"23,25,26,27","lever":3,"info":"主要用于为后代的Button类型组件统一设置默认属性,也可以通过该组件获取默认Button的属性。","image":""},{"id":327,"family":5,"name":"MaterialBannerTheme","nameCN":"横幅样式","linkWidget":"211","lever":2,"info":"主要用于为后代的MaterialBanner组件统一设置默认属性,也可以通过该组件获取默认MaterialBanner的属性。","image":""},{"id":328,"family":5,"name":"ChipTheme","nameCN":"小条样式","linkWidget":"11,153,12,13,14,15","lever":3,"info":"主要用于为后代的Chip类型组件统一设置默认属性,也可以通过该组件获取默认Chip的属性。","image":""},{"id":329,"family":5,"name":"DividerTheme","nameCN":"分割线样式","linkWidget":"34,35","lever":3,"info":"主要用于为后代的Divider类型组件统一设置默认属性,也可以通过该组件获取默认Divider的属性。","image":""},{"id":330,"family":5,"name":"PopupMenuTheme","nameCN":"弹出菜单样式","linkWidget":"56","lever":2,"info":"主要用于为后代的PopupMenuButton组件统一设置默认属性,也可以通过该组件获取默认PopupMenu的属性。","image":""},{"id":331,"family":5,"name":"SliderTheme","nameCN":"滑块样式","linkWidget":"42","lever":3,"info":"可容纳一个孩子,为后代的Slider指定默认样式。常用于Slider的样式统一,避免一一设置,也可以对Slider进行样式定制。","image":""},{"id":332,"family":5,"name":"ToggleButtonsTheme","nameCN":"滑块样式","linkWidget":"33","lever":2,"info":"主要用于为后代的ToggleButtons组件统一设置默认属性,也可以通过该组件获取默认ToggleButtons的属性。","image":""},{"id":333,"family":5,"name":"TooltipTheme","nameCN":"提示主题","linkWidget":"50","lever":2,"info":"主要用于为后代的Tooltip组件统一设置默认属性,也可以通过该组件获取默认TooltipTheme的属性。","image":""},{"id":334,"family":5,"name":"ListTileTheme","nameCN":"ListTile主题","linkWidget":"16","lever":2,"info":"主要用于为后代的ListTile组件统一设置默认属性,也可以通过该组件获取默认ListTile的属性。","image":""},{"id":338,"family":5,"name":"ButtonBarTheme","nameCN":"按钮条主题","linkWidget":"29","lever":2,"info":"主要用于为后代的ButtonBar组件统一设置默认属性,也可以通过该组件获取默认ButtonBarTheme的属性。","image":""},{"id":340,"family":3,"name":"Viewport","nameCN":"视口组件","linkWidget":"253,349","lever":1,"info":"通常用于为滑动视图提供视口,仅构建显示和预加载的部位。可指定预加载的长度、滑动轴向等。是ScrollView的核心实现组件之一,一般不直接使用。","image":""},{"id":341,"family":3,"name":"CustomMultiChildLayout","nameCN":"通用多子布局","linkWidget":"315,285","lever":4,"info":"使用一个代理类对子组件集进行布局控制,子组件必须使用LayoutId组件进行标识。","image":""},{"id":342,"family":3,"name":"ListBody","nameCN":"列表体","linkWidget":"162","lever":1,"info":"将若干子组件按照轴向进行排列,可设置的属性很少,一般很少使用,而选择使用ListView。","image":""},{"id":351,"family":1,"name":"InteractiveViewer","nameCN":"交互视图","linkWidget":"147,146,78","lever":4,"info":"主要对移动、缩放等手势交互进行封装,简化使用,可指定移动边界、缩放比例、手势监听等。","image":""},{"id":352,"family":0,"name":"CupertinoDialogAction","nameCN":"交互视图","linkWidget":"129","lever":1,"info":" 一个简单的按钮,通常用于CupertinoAlertDialog中,一般不单独使用。","image":""}]
\ No newline at end of file
diff --git a/assets/flutter.db b/assets/flutter.db
index 132af61ea..4ca299955 100644
Binary files a/assets/flutter.db and b/assets/flutter.db differ
diff --git a/assets/fonts/CHOPS.TTF b/assets/fonts/CHOPS.ttf
similarity index 100%
rename from assets/fonts/CHOPS.TTF
rename to assets/fonts/CHOPS.ttf
diff --git a/assets/iconfont/icon_builder.dart b/assets/iconfont/icon_builder.dart
deleted file mode 100644
index 4bd785edb..000000000
--- a/assets/iconfont/icon_builder.dart
+++ /dev/null
@@ -1,49 +0,0 @@
-import 'dart:io';
-
-import 'package:path/path.dart' as path;
-
-main() async{
- String fontName ='TolyIcon';
- String fileName ='toly_icon';
- String resDir="assets/iconfont";//资源文件夹
- String outFile='lib/app/res/$fileName.dart';//输出文件地址
-
- String result = """import 'package:flutter/widgets.dart';
-//Power By 张风捷特烈--- Generated file. Do not edit.
-
-class $fontName {
-
- $fontName._();
-""";
- File fileCss = File(path.join(Directory.current.path,"$resDir/iconfont.css"));
- if (! await fileCss.exists()) return;
-
- String read = await fileCss.readAsString();
- List split = read.split(".icon-");
- split.forEach((str) {
- if (str.contains("before")) {
- List split = str.split(":");
- result += "static const IconData " +
- split[0].replaceAll("-", "_") +
- " = const IconData(" +
- split[2].replaceAll("\"\\", "0x").split("\"")[0] +
- ", fontFamily: \"$fontName\");\n";
- }
- });
- result+="}";
- fileCss.delete();//删除css文件
-
- File fileOut = File(path.join(Directory.current.path,"$outFile"));
- if(! await fileOut.exists()){
- await fileOut.create(recursive: true);
- }
- fileOut.writeAsString(result);//将代码写入dart文件
-
- String config="""
- fonts:
- - family: $fontName
- fonts:
- - asset: """+"$resDir/iconfont.ttf";
-
- print("build OK:\n $config");
-}
\ No newline at end of file
diff --git a/assets/iconfont/iconfont.ttf b/assets/iconfont/iconfont.ttf
deleted file mode 100644
index 42c75a06b..000000000
Binary files a/assets/iconfont/iconfont.ttf and /dev/null differ
diff --git a/assets/iconfont/toly_icon.ttf b/assets/iconfont/toly_icon.ttf
new file mode 100644
index 000000000..f112440c2
Binary files /dev/null and b/assets/iconfont/toly_icon.ttf differ
diff --git a/assets/images/caver.webp b/assets/images/caver.webp
index 426ab0ccb..3d4102c05 100644
Binary files a/assets/images/caver.webp and b/assets/images/caver.webp differ
diff --git a/assets/images/coffee_wx.webp b/assets/images/coffee_wx.webp
new file mode 100644
index 000000000..34298068b
Binary files /dev/null and b/assets/images/coffee_wx.webp differ
diff --git a/assets/images/coffee_wx_ac.webp b/assets/images/coffee_wx_ac.webp
new file mode 100644
index 000000000..1d21f46fe
Binary files /dev/null and b/assets/images/coffee_wx_ac.webp differ
diff --git a/assets/images/coffee_zfb.webp b/assets/images/coffee_zfb.webp
new file mode 100644
index 000000000..79859859c
Binary files /dev/null and b/assets/images/coffee_zfb.webp differ
diff --git a/assets/images/flutter.png b/assets/images/flutter.png
new file mode 100644
index 000000000..7da1247be
Binary files /dev/null and b/assets/images/flutter.png differ
diff --git a/assets/images/logo1.webp b/assets/images/logo1.webp
new file mode 100644
index 000000000..4e0dfcb61
Binary files /dev/null and b/assets/images/logo1.webp differ
diff --git a/assets/images/pica.gif b/assets/images/pica.gif
deleted file mode 100644
index 6d2b050f5..000000000
Binary files a/assets/images/pica.gif and /dev/null differ
diff --git a/assets/images/widgets/Autocomplete.svg b/assets/images/widgets/Autocomplete.svg
new file mode 100644
index 000000000..653b4f5a1
--- /dev/null
+++ b/assets/images/widgets/Autocomplete.svg
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/assets/images/widgets/Banner.svg b/assets/images/widgets/Banner.svg
new file mode 100644
index 000000000..27c390ff1
--- /dev/null
+++ b/assets/images/widgets/Banner.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/widgets/Card.svg b/assets/images/widgets/Card.svg
new file mode 100644
index 000000000..62d2d4b8d
--- /dev/null
+++ b/assets/images/widgets/Card.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/widgets/Card.webp b/assets/images/widgets/Card.webp
deleted file mode 100644
index 9f8452a43..000000000
Binary files a/assets/images/widgets/Card.webp and /dev/null differ
diff --git a/assets/images/widgets/Chip.svg b/assets/images/widgets/Chip.svg
new file mode 100644
index 000000000..a66547522
--- /dev/null
+++ b/assets/images/widgets/Chip.svg
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/widgets/Chip.webp b/assets/images/widgets/Chip.webp
deleted file mode 100644
index 1be3bfa81..000000000
Binary files a/assets/images/widgets/Chip.webp and /dev/null differ
diff --git a/assets/images/widgets/CircleAvatar.svg b/assets/images/widgets/CircleAvatar.svg
new file mode 100644
index 000000000..eafafcb46
--- /dev/null
+++ b/assets/images/widgets/CircleAvatar.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/widgets/Container.svg b/assets/images/widgets/Container.svg
new file mode 100644
index 000000000..c1500829f
--- /dev/null
+++ b/assets/images/widgets/Container.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/widgets/Container.webp b/assets/images/widgets/Container.webp
deleted file mode 100644
index 0cc509a9a..000000000
Binary files a/assets/images/widgets/Container.webp and /dev/null differ
diff --git a/assets/images/widgets/FilterChip.svg b/assets/images/widgets/FilterChip.svg
new file mode 100644
index 000000000..2c0214a26
--- /dev/null
+++ b/assets/images/widgets/FilterChip.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/widgets/FloatingActionButton.svg b/assets/images/widgets/FloatingActionButton.svg
new file mode 100644
index 000000000..dfe232950
--- /dev/null
+++ b/assets/images/widgets/FloatingActionButton.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/images/widgets/FlutterLogo.svg b/assets/images/widgets/FlutterLogo.svg
new file mode 100644
index 000000000..6a82787f7
--- /dev/null
+++ b/assets/images/widgets/FlutterLogo.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/assets/images/widgets/GestureDetector.svg b/assets/images/widgets/GestureDetector.svg
new file mode 100644
index 000000000..8d3a00012
--- /dev/null
+++ b/assets/images/widgets/GestureDetector.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/images/widgets/GridView.svg b/assets/images/widgets/GridView.svg
new file mode 100644
index 000000000..2d7f6874a
--- /dev/null
+++ b/assets/images/widgets/GridView.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/widgets/Icon.svg b/assets/images/widgets/Icon.svg
new file mode 100644
index 000000000..dd64950cb
--- /dev/null
+++ b/assets/images/widgets/Icon.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/widgets/Image.svg b/assets/images/widgets/Image.svg
new file mode 100644
index 000000000..e69de29bb
diff --git a/assets/images/widgets/InputChip.svg b/assets/images/widgets/InputChip.svg
new file mode 100644
index 000000000..d50adf71c
--- /dev/null
+++ b/assets/images/widgets/InputChip.svg
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/widgets/InputChip.webp b/assets/images/widgets/InputChip.webp
deleted file mode 100644
index c6bb78834..000000000
Binary files a/assets/images/widgets/InputChip.webp and /dev/null differ
diff --git a/assets/images/widgets/ListView.svg b/assets/images/widgets/ListView.svg
new file mode 100644
index 000000000..4e10e6580
--- /dev/null
+++ b/assets/images/widgets/ListView.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/widgets/MaterialButton.svg b/assets/images/widgets/MaterialButton.svg
new file mode 100644
index 000000000..11b59f54b
--- /dev/null
+++ b/assets/images/widgets/MaterialButton.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/widgets/PageView.svg b/assets/images/widgets/PageView.svg
new file mode 100644
index 000000000..5dc3a701d
--- /dev/null
+++ b/assets/images/widgets/PageView.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/assets/images/widgets/RichText.svg b/assets/images/widgets/RichText.svg
new file mode 100644
index 000000000..0dd5f661a
--- /dev/null
+++ b/assets/images/widgets/RichText.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/assets/images/widgets/SingleChildScrollView.svg b/assets/images/widgets/SingleChildScrollView.svg
new file mode 100644
index 000000000..baddde13b
--- /dev/null
+++ b/assets/images/widgets/SingleChildScrollView.svg
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/widgets/Text.png b/assets/images/widgets/Text.png
new file mode 100644
index 000000000..5f690258f
Binary files /dev/null and b/assets/images/widgets/Text.png differ
diff --git a/assets/images/widgets/Text.svg b/assets/images/widgets/Text.svg
new file mode 100644
index 000000000..2b327a5de
--- /dev/null
+++ b/assets/images/widgets/Text.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/images/widgets/Widget.svg b/assets/images/widgets/Widget.svg
new file mode 100644
index 000000000..f92990967
--- /dev/null
+++ b/assets/images/widgets/Widget.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/assets/images/wxgzh.webp b/assets/images/wxgzh.webp
new file mode 100644
index 000000000..0a44c72cc
Binary files /dev/null and b/assets/images/wxgzh.webp differ
diff --git a/assets/version.json b/assets/version.json
index 79dcc07ab..0c311e970 100644
--- a/assets/version.json
+++ b/assets/version.json
@@ -1,3 +1,3 @@
{
- "dbVersion": 2
+ "dbVersion": 5
}
\ No newline at end of file
diff --git a/desiredFileName.txt b/desiredFileName.txt
new file mode 100644
index 000000000..9e26dfeeb
--- /dev/null
+++ b/desiredFileName.txt
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/devtools_options.yaml b/devtools_options.yaml
new file mode 100644
index 000000000..fa0b357c4
--- /dev/null
+++ b/devtools_options.yaml
@@ -0,0 +1,3 @@
+description: This file stores settings for Dart & Flutter DevTools.
+documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
+extensions:
diff --git a/doc/development/architecture.md b/doc/development/architecture.md
new file mode 100644
index 000000000..65c14cf2b
--- /dev/null
+++ b/doc/development/architecture.md
@@ -0,0 +1,247 @@
+# FlutterUnit 架构设计文档
+
+## 项目概述
+
+FlutterUnit 是一个全平台的 Flutter 组件展示和学习应用,支持 Android、iOS、Web、Windows、macOS 和 Linux 平台。项目采用模块化架构,提供了 300+ Flutter 组件的详细展示、代码示例和交互演示。
+
+## 技术栈
+
+- **框架**: Flutter 3.35.1
+- **状态管理**: flutter_bloc (BLoC 模式)
+- **路由管理**: go_router
+- **数据库**: SQLite (本地数据存储)
+- **网络请求**: dio
+- **国际化**: flutter_localizations
+- **UI组件**: 自研 TolyUI 组件库
+
+## 整体架构
+
+### 分层架构
+
+```
+┌─────────────────────────────────────┐
+│ Presentation Layer │ ← UI层 (Views/Pages)
+├─────────────────────────────────────┤
+│ Business Logic Layer │ ← 业务逻辑层 (BLoC)
+├─────────────────────────────────────┤
+│ Repository Layer │ ← 仓储层 (Repository)
+├─────────────────────────────────────┤
+│ Data Source Layer │ ← 数据源层 (Database/API)
+└─────────────────────────────────────┘
+```
+
+### 模块化设计
+
+```
+FlutterUnit/
+├── modules/
+│ ├── basic_system/ # 基础系统模块
+│ │ ├── app/ # 应用核心配置
+│ │ ├── app_update/ # 应用更新
+│ │ ├── authentication/ # 用户认证
+│ │ ├── components/ # 通用组件
+│ │ ├── l10n/ # 国际化
+│ │ ├── storage/ # 数据存储
+│ │ ├── toly_ui/ # UI组件库
+│ │ └── utils/ # 工具类
+│ ├── widget_system/ # 组件系统模块
+│ │ ├── widget_module/ # 组件业务逻辑
+│ │ ├── widget_repository/ # 组件数据仓储
+│ │ └── widget_ui/ # 组件UI展示
+│ ├── knowledge_system/ # 知识系统模块
+│ │ ├── algorithm/ # 算法相关
+│ │ ├── artifact/ # 工件管理
+│ │ ├── awesome/ # 精选内容
+│ │ ├── layout/ # 布局相关
+│ │ └── note/ # 笔记功能
+│ ├── painting_system/ # 绘制系统模块
+│ │ └── draw_system/ # 自定义绘制
+│ └── tools_system/ # 工具系统模块
+│ └── treasure_tools/ # 实用工具集
+└── lib/
+ ├── src/
+ │ ├── navigation/ # 路由导航
+ │ ├── l10n/ # 本地化
+ │ └── starter/ # 应用启动
+ └── main.dart
+```
+
+## 核心架构组件
+
+### 1. 应用启动器 (FxApplication)
+
+```dart
+class FxApplication with FxStarter {
+ @override
+ Widget get app => const AppBlocProvider(child: FlutterUnit3());
+
+ @override
+ AppStartRepository get repository => const FlutterUnitStartRepo();
+}
+```
+
+**职责**:
+- 应用启动流程管理
+- 全局配置初始化
+- 错误处理和监控
+
+### 2. 状态管理 (BLoC 模式)
+
+```
+Event → BLoC → State → UI
+ ↑ ↓
+ └── User Interaction ┘
+```
+
+**主要 BLoC**:
+- `AppConfigBloc`: 应用配置管理
+- `WidgetsBloc`: 组件数据管理
+- `CategoryBloc`: 分类管理
+- `LikeWidgetBloc`: 收藏功能
+
+### 3. 路由架构
+
+```dart
+GoRoute(
+ path: AppRoute.home.path,
+ routes: [
+ if (kAppEnv.isDesktopUI)
+ ShellRoute(
+ builder: (_, __, Widget child) => AppDeskNavigation(content: child),
+ routes: body,
+ ),
+ if (!kAppEnv.isDesktopUI) ...body,
+ ],
+)
+```
+
+**特点**:
+- 支持桌面端和移动端不同导航
+- 声明式路由配置
+- 深度链接支持
+
+### 4. 数据层架构
+
+#### Repository 模式
+
+```dart
+abstract class WidgetRepository {
+ Future> loadWidgets();
+ Future findWidget(int id);
+ Future> loadNodeByWidgetId(int widgetId);
+}
+```
+
+**实现层**:
+- `WidgetDbRepository`: 数据库实现
+- `MemoryWidgetRepository`: 内存缓存实现
+
+#### 数据库设计
+
+**核心表**:
+- `widget`: Widget基本信息
+- `node`: 示例代码节点
+- `category`: Widget分类
+
+详见: [数据表结构总览](../modules/widget_system/widget_repository/doc/tables_overview.md)
+
+## 平台适配
+
+### 平台检测
+
+```dart
+class kAppEnv {
+ static bool get isWeb;
+ static bool get isDesktopUI;
+ static bool get isMobile;
+}
+```
+
+### 响应式设计
+
+- **移动端**: 底部导航 + 侧滑菜单
+- **桌面端**: 侧边栏导航 + 多窗口布局
+- **Web端**: 响应式布局适配
+
+## 核心功能
+
+### 1. 组件展示系统
+
+- 300+ Flutter组件收录
+- 实时代码演示
+- 交互式组件体验
+- 组件关联跳转
+
+### 2. 搜索与过滤
+
+- 组件名称搜索
+- 星级过滤
+- 分类筛选
+
+### 3. 收藏系统
+
+- 自定义收藏集
+- 收藏集管理
+- 批量操作
+
+### 4. 主题系统
+
+- 明暗主题切换
+- 8种预设颜色主题
+- 6种字体选择
+- 自定义代码高亮
+
+## 性能优化
+
+### 1. 数据缓存
+- 内存缓存: 热点数据常驻内存
+- 数据库缓存: 本地SQLite存储
+
+### 2. 懒加载
+- 路由懒加载: 按需加载页面
+- 组件懒加载: 滚动时动态加载
+
+### 3. 构建优化
+- 代码分割: 模块化打包
+- 资源优化: 图片压缩、字体子集化
+
+## 构建与部署
+
+### 多平台构建
+
+```bash
+# Android
+flutter build apk --target-platform --split-per-abi
+
+# iOS
+flutter build ios
+
+# Web
+flutter build web
+
+# Desktop
+flutter build windows
+flutter build macos
+flutter build linux
+```
+
+### 发布渠道
+
+- Android: APK 直接下载
+- iOS: App Store
+- Web: 在线访问
+- Desktop: 可执行文件下载
+
+## 开发规范
+
+### 代码规范
+- 遵循 Dart 官方代码规范
+- 使用 `flutter_lints` 进行代码检查
+
+### 模块规范
+- 每个模块独立的 `pubspec.yaml`
+- 清晰的模块边界和依赖关系
+
+### 测试规范
+- 单元测试覆盖核心业务逻辑
+- Widget测试验证UI行为
\ No newline at end of file
diff --git a/doc/ewm/coffee1.png b/doc/ewm/coffee1.png
new file mode 100644
index 000000000..dbbf38bc7
Binary files /dev/null and b/doc/ewm/coffee1.png differ
diff --git a/doc/screens/macos-2.webp b/doc/screens/macos-2.webp
new file mode 100644
index 000000000..f2de629cf
Binary files /dev/null and b/doc/screens/macos-2.webp differ
diff --git a/doc/screens/preview.webp b/doc/screens/preview.webp
new file mode 100644
index 000000000..79cf8b002
Binary files /dev/null and b/doc/screens/preview.webp differ
diff --git a/doc/screens/windows-1.png b/doc/screens/windows-1.png
new file mode 100644
index 000000000..dc46f4c6b
Binary files /dev/null and b/doc/screens/windows-1.png differ
diff --git a/doc/version/3.1.0.md b/doc/version/3.1.0.md
new file mode 100644
index 000000000..d551bad2a
--- /dev/null
+++ b/doc/version/3.1.0.md
@@ -0,0 +1,10 @@
+桌面版:
+windows/macos 支持应用内更新,优化更新过程交互
+增加: 知识集锦/布局宝库
+增加 Ctrl+F 全局搜索功能
+
+全端:
+增加收录组件,目前共 354 个
+支持寻路算法演绎
+优化组件详情展示
+支持复制局部代码
diff --git a/doc/version/3.2.0.md b/doc/version/3.2.0.md
new file mode 100644
index 000000000..9afbc2168
--- /dev/null
+++ b/doc/version/3.2.0.md
@@ -0,0 +1,9 @@
+全端:
+增加最新咨询功能
+优化组件列表展示,增加logo设计图
+增加世界留言板
+优化项目结构
+组件数据支持 10 国语言国际化
+
+下载失败,可到下面网站下载最新版
+https://gitee.com/toly1994328/FlutterUnit/releases
\ No newline at end of file
diff --git a/ios/.gitignore b/ios/.gitignore
index e96ef602b..7a7f9873a 100644
--- a/ios/.gitignore
+++ b/ios/.gitignore
@@ -1,3 +1,4 @@
+**/dgph
*.mode1v3
*.mode2v3
*.moved-aside
@@ -18,6 +19,7 @@ Flutter/App.framework
Flutter/Flutter.framework
Flutter/Flutter.podspec
Flutter/Generated.xcconfig
+Flutter/ephemeral/
Flutter/app.flx
Flutter/app.zip
Flutter/flutter_assets/
diff --git a/ios/Flutter/.last_build_id b/ios/Flutter/.last_build_id
deleted file mode 100644
index 0c650dedc..000000000
--- a/ios/Flutter/.last_build_id
+++ /dev/null
@@ -1 +0,0 @@
-320b85efcc94a82643501e6e104b8446
\ No newline at end of file
diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist
index 6b4c0f78a..9625e105d 100644
--- a/ios/Flutter/AppFrameworkInfo.plist
+++ b/ios/Flutter/AppFrameworkInfo.plist
@@ -3,7 +3,7 @@
CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
+ en
CFBundleExecutable
App
CFBundleIdentifier
@@ -21,6 +21,6 @@
CFBundleVersion
1.0
MinimumOSVersion
- 8.0
+ 11.0
diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig
index e8efba114..ec97fc6f3 100644
--- a/ios/Flutter/Debug.xcconfig
+++ b/ios/Flutter/Debug.xcconfig
@@ -1,2 +1,2 @@
-#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"
diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig
index 399e9340e..c4855bfe2 100644
--- a/ios/Flutter/Release.xcconfig
+++ b/ios/Flutter/Release.xcconfig
@@ -1,2 +1,2 @@
-#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"
diff --git a/ios/Podfile b/ios/Podfile
index 1e8c3c90a..88359b225 100644
--- a/ios/Podfile
+++ b/ios/Podfile
@@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project
-# platform :ios, '9.0'
+# platform :ios, '11.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
index e0f7b2a6a..42719a09a 100644
--- a/ios/Podfile.lock
+++ b/ios/Podfile.lock
@@ -1,65 +1,133 @@
PODS:
- - connectivity (0.0.1):
+ - connectivity_plus (0.0.1):
+ - Flutter
+ - ReachabilitySwift
+ - DKImagePickerController/Core (4.3.4):
+ - DKImagePickerController/ImageDataManager
+ - DKImagePickerController/Resource
+ - DKImagePickerController/ImageDataManager (4.3.4)
+ - DKImagePickerController/PhotoGallery (4.3.4):
+ - DKImagePickerController/Core
+ - DKPhotoGallery
+ - DKImagePickerController/Resource (4.3.4)
+ - DKPhotoGallery (0.0.17):
+ - DKPhotoGallery/Core (= 0.0.17)
+ - DKPhotoGallery/Model (= 0.0.17)
+ - DKPhotoGallery/Preview (= 0.0.17)
+ - DKPhotoGallery/Resource (= 0.0.17)
+ - SDWebImage
+ - SwiftyGif
+ - DKPhotoGallery/Core (0.0.17):
+ - DKPhotoGallery/Model
+ - DKPhotoGallery/Preview
+ - SDWebImage
+ - SwiftyGif
+ - DKPhotoGallery/Model (0.0.17):
+ - SDWebImage
+ - SwiftyGif
+ - DKPhotoGallery/Preview (0.0.17):
+ - DKPhotoGallery/Model
+ - DKPhotoGallery/Resource
+ - SDWebImage
+ - SwiftyGif
+ - DKPhotoGallery/Resource (0.0.17):
+ - SDWebImage
+ - SwiftyGif
+ - file_picker (0.0.1):
+ - DKImagePickerController/PhotoGallery
- Flutter
- - Reachability
- Flutter (1.0.0)
- FMDB (2.7.5):
- FMDB/standard (= 2.7.5)
- FMDB/standard (2.7.5)
- - path_provider (0.0.1):
+ - package_info_plus (0.4.5):
+ - Flutter
+ - path_provider_ios (0.0.1):
- Flutter
- - Reachability (3.2)
- - share (0.0.1):
+ - r_upgrade (0.0.1):
- Flutter
- - shared_preferences (0.0.1):
+ - ReachabilitySwift (5.0.0)
+ - SDWebImage (5.15.4):
+ - SDWebImage/Core (= 5.15.4)
+ - SDWebImage/Core (5.15.4)
+ - share_plus (0.0.1):
+ - Flutter
+ - shared_preferences_ios (0.0.1):
- Flutter
- sqflite (0.0.2):
- Flutter
- FMDB (>= 2.7.5)
- - url_launcher (0.0.1):
+ - SwiftyGif (5.4.4)
+ - url_launcher_ios (0.0.1):
+ - Flutter
+ - webview_flutter_wkwebview (0.0.1):
- Flutter
DEPENDENCIES:
- - connectivity (from `.symlinks/plugins/connectivity/ios`)
+ - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
+ - file_picker (from `.symlinks/plugins/file_picker/ios`)
- Flutter (from `Flutter`)
- - path_provider (from `.symlinks/plugins/path_provider/ios`)
- - share (from `.symlinks/plugins/share/ios`)
- - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`)
+ - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
+ - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`)
+ - r_upgrade (from `.symlinks/plugins/r_upgrade/ios`)
+ - share_plus (from `.symlinks/plugins/share_plus/ios`)
+ - shared_preferences_ios (from `.symlinks/plugins/shared_preferences_ios/ios`)
- sqflite (from `.symlinks/plugins/sqflite/ios`)
- - url_launcher (from `.symlinks/plugins/url_launcher/ios`)
+ - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
+ - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`)
SPEC REPOS:
trunk:
+ - DKImagePickerController
+ - DKPhotoGallery
- FMDB
- - Reachability
+ - ReachabilitySwift
+ - SDWebImage
+ - SwiftyGif
EXTERNAL SOURCES:
- connectivity:
- :path: ".symlinks/plugins/connectivity/ios"
+ connectivity_plus:
+ :path: ".symlinks/plugins/connectivity_plus/ios"
+ file_picker:
+ :path: ".symlinks/plugins/file_picker/ios"
Flutter:
:path: Flutter
- path_provider:
- :path: ".symlinks/plugins/path_provider/ios"
- share:
- :path: ".symlinks/plugins/share/ios"
- shared_preferences:
- :path: ".symlinks/plugins/shared_preferences/ios"
+ package_info_plus:
+ :path: ".symlinks/plugins/package_info_plus/ios"
+ path_provider_ios:
+ :path: ".symlinks/plugins/path_provider_ios/ios"
+ r_upgrade:
+ :path: ".symlinks/plugins/r_upgrade/ios"
+ share_plus:
+ :path: ".symlinks/plugins/share_plus/ios"
+ shared_preferences_ios:
+ :path: ".symlinks/plugins/shared_preferences_ios/ios"
sqflite:
:path: ".symlinks/plugins/sqflite/ios"
- url_launcher:
- :path: ".symlinks/plugins/url_launcher/ios"
+ url_launcher_ios:
+ :path: ".symlinks/plugins/url_launcher_ios/ios"
+ webview_flutter_wkwebview:
+ :path: ".symlinks/plugins/webview_flutter_wkwebview/ios"
SPEC CHECKSUMS:
- connectivity: c4130b2985d4ef6fd26f9702e886bd5260681467
- Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c
+ connectivity_plus: 07c49e96d7fc92bc9920617b83238c4d178b446a
+ DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac
+ DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179
+ file_picker: ce3938a0df3cc1ef404671531facef740d03f920
+ Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
- path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c
- Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96
- share: 0b2c3e82132f5888bccca3351c504d0003b3b410
- shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d
+ package_info_plus: fd030dabf36271f146f1f3beacd48f564b0f17f7
+ path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02
+ r_upgrade: 44d715c61914cce3d01ea225abffe894fd51c114
+ ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825
+ SDWebImage: 1c39de67663e5eebb2f41324d5d580eeea12dd4c
+ share_plus: 599aa54e4ea31d4b4c0e9c911bcc26c55e791028
+ shared_preferences_ios: 548a61f8053b9b8a49ac19c1ffbc8b92c50d68ad
sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
- url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef
+ SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f
+ url_launcher_ios: 839c58cdb4279282219f5e248c3321761ff3c4de
+ webview_flutter_wkwebview: 2e2d318f21a5e036e2c3f26171342e95908bd60a
-PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c
+PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3
-COCOAPODS: 1.10.1
+COCOAPODS: 1.12.0
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 6450c5b7c..4d990781b 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -3,17 +3,17 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 46;
+ objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
- 84DD72D28C46F1BB3BEBC8BF /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 110BA964F25219A444600C8C /* Pods_Runner.framework */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
+ D1D82669BF3BEF35AB05B2B1 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C7383EE4A15C8DD5DC0FFE49 /* Pods_Runner.framework */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
@@ -30,15 +30,14 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
- 110BA964F25219A444600C8C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
- 40803ECD9DE781BA9823C8F9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
+ 64130BD95C8A67B133F535A6 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
- 96F0D2C37BCCAC3201451BB2 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
+ 8124494143C478106CBB5535 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -46,7 +45,8 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
- D6D9DCBCB8FFD1DDF50C51BD /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
+ ADBDEEDA55D5FE126765D6DA /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
+ C7383EE4A15C8DD5DC0FFE49 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -54,21 +54,31 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 84DD72D28C46F1BB3BEBC8BF /* Pods_Runner.framework in Frameworks */,
+ D1D82669BF3BEF35AB05B2B1 /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
- 6D1B05DC8ACF1C1F8FFD8A7D /* Frameworks */ = {
+ 3357CCFDF19B51BC0DBF2F91 /* Frameworks */ = {
isa = PBXGroup;
children = (
- 110BA964F25219A444600C8C /* Pods_Runner.framework */,
+ C7383EE4A15C8DD5DC0FFE49 /* Pods_Runner.framework */,
);
name = Frameworks;
sourceTree = "";
};
+ 47118212ECDE60EDA8D81265 /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ ADBDEEDA55D5FE126765D6DA /* Pods-Runner.debug.xcconfig */,
+ 8124494143C478106CBB5535 /* Pods-Runner.release.xcconfig */,
+ 64130BD95C8A67B133F535A6 /* Pods-Runner.profile.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "";
+ };
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
@@ -86,8 +96,8 @@
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
- AB34C6A5ACB1D149FB8F864B /* Pods */,
- 6D1B05DC8ACF1C1F8FFD8A7D /* Frameworks */,
+ 47118212ECDE60EDA8D81265 /* Pods */,
+ 3357CCFDF19B51BC0DBF2F91 /* Frameworks */,
);
sourceTree = "";
};
@@ -114,17 +124,6 @@
path = Runner;
sourceTree = "";
};
- AB34C6A5ACB1D149FB8F864B /* Pods */ = {
- isa = PBXGroup;
- children = (
- D6D9DCBCB8FFD1DDF50C51BD /* Pods-Runner.debug.xcconfig */,
- 96F0D2C37BCCAC3201451BB2 /* Pods-Runner.release.xcconfig */,
- 40803ECD9DE781BA9823C8F9 /* Pods-Runner.profile.xcconfig */,
- );
- name = Pods;
- path = Pods;
- sourceTree = "";
- };
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -132,14 +131,14 @@
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
- 36F73146086477EBD377777E /* [CP] Check Pods Manifest.lock */,
+ BF5658AA55AEB255A85F6911 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
- C780EF36233459FEE95BD85A /* [CP] Embed Pods Frameworks */,
+ 690C1029D98F763064F681B2 /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@@ -156,7 +155,7 @@
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
- LastUpgradeCheck = 1020;
+ LastUpgradeCheck = 1300;
ORGANIZATIONNAME = "";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
@@ -198,44 +197,42 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
- 36F73146086477EBD377777E /* [CP] Check Pods Manifest.lock */ = {
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
- inputFileListPaths = (
- );
inputPaths = (
- "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
- "${PODS_ROOT}/Manifest.lock",
- );
- name = "[CP] Check Pods Manifest.lock";
- outputFileListPaths = (
+ "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
);
+ name = "Thin Binary";
outputPaths = (
- "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
- showEnvVarsInLog = 0;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
- 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
+ 690C1029D98F763064F681B2 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
- inputPaths = (
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
- name = "Thin Binary";
- outputPaths = (
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
@@ -248,21 +245,26 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
- C780EF36233459FEE95BD85A /* [CP] Embed Pods Frameworks */ = {
+ BF5658AA55AEB255A85F6911 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
- name = "[CP] Embed Pods Frameworks";
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
@@ -340,7 +342,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@@ -355,20 +357,25 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = XQPP7CHG9D;
+ "DEVELOPMENT_TEAM[sdk=iphoneos*]" = XQPP7CHG9D;
ENABLE_BITCODE = NO;
- FRAMEWORK_SEARCH_PATHS = (
+ GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
- "$(PROJECT_DIR)/Flutter",
+ "DISABLE_PUSH_NOTIFICATIONS=1",
);
INFOPLIST_FILE = Runner/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- LIBRARY_SEARCH_PATHS = (
+ INFOPLIST_KEY_CFBundleDisplayName = FlutterUnit;
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
+ LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
- "$(PROJECT_DIR)/Flutter",
+ "@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.toly1994.flutterUnit;
+ MARKETING_VERSION = 2.9.2;
+ PRODUCT_BUNDLE_IDENTIFIER = "com.toly1994.flutter-unit";
PRODUCT_NAME = "$(TARGET_NAME)";
+ "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = flutter_unit_profile;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
@@ -422,7 +429,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -471,11 +478,12 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
- SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
@@ -487,20 +495,29 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ CODE_SIGN_IDENTITY = "Apple Development";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ CODE_SIGN_STYLE = Manual;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = "";
+ "DEVELOPMENT_TEAM[sdk=iphoneos*]" = XQPP7CHG9D;
ENABLE_BITCODE = NO;
- FRAMEWORK_SEARCH_PATHS = (
+ GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
- "$(PROJECT_DIR)/Flutter",
+ "DISABLE_PUSH_NOTIFICATIONS=1",
);
INFOPLIST_FILE = Runner/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- LIBRARY_SEARCH_PATHS = (
+ INFOPLIST_KEY_CFBundleDisplayName = FlutterUnit;
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
+ LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
- "$(PROJECT_DIR)/Flutter",
+ "@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.toly1994.flutterUnit;
+ MARKETING_VERSION = 2.9.2;
+ PRODUCT_BUNDLE_IDENTIFIER = "com.toly1994.flutter-unit";
PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = flutter_unit_profile;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
@@ -514,20 +531,29 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ CODE_SIGN_IDENTITY = "Apple Development";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ CODE_SIGN_STYLE = Manual;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = "";
+ "DEVELOPMENT_TEAM[sdk=iphoneos*]" = XQPP7CHG9D;
ENABLE_BITCODE = NO;
- FRAMEWORK_SEARCH_PATHS = (
+ GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
- "$(PROJECT_DIR)/Flutter",
+ "DISABLE_PUSH_NOTIFICATIONS=1",
);
INFOPLIST_FILE = Runner/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- LIBRARY_SEARCH_PATHS = (
+ INFOPLIST_KEY_CFBundleDisplayName = FlutterUnit;
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
+ LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
- "$(PROJECT_DIR)/Flutter",
+ "@executable_path/Frameworks",
);
- PRODUCT_BUNDLE_IDENTIFIER = com.toly1994.flutterUnit;
+ MARKETING_VERSION = 2.9.2;
+ PRODUCT_BUNDLE_IDENTIFIER = "com.toly1994.flutter-unit";
PRODUCT_NAME = "$(TARGET_NAME)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = flutter_unit_profile;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
index a28140cfd..c87d15a33 100644
--- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -1,6 +1,6 @@
-
-
-
-
+
+
-
-
-
-NSAppTransportSecurity
-
- NSAllowsArbitraryLoads
-
-
+ CADisableMinimumFrameDurationOnPhone
+
CFBundleDevelopmentRegion
$(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Flutter Unit
CFBundleExecutable
$(EXECUTABLE_NAME)
CFBundleIdentifier
@@ -28,6 +26,8 @@
$(FLUTTER_BUILD_NUMBER)
LSRequiresIPhoneOS
+ UIApplicationSupportsIndirectInputEvents
+
UILaunchStoryboardName
LaunchScreen
UIMainStoryboardFile
@@ -47,5 +47,9 @@
UIViewControllerBasedStatusBarAppearance
+ NSPhotoLibraryUsageDescription
+ FlutterUnit 申请访问相册,以提升您的图片选择功能的体验
+ NSPhotoLibraryAddUsageDescription
+ FlutterUnit 申请访问相册,以支持您保存图片到相册
diff --git a/ios/build/Pods.build/Release-iphonesimulator/FMDB.build/dgph b/ios/build/Pods.build/Release-iphonesimulator/FMDB.build/dgph
deleted file mode 100644
index 39995fc18..000000000
Binary files a/ios/build/Pods.build/Release-iphonesimulator/FMDB.build/dgph and /dev/null differ
diff --git a/ios/build/Pods.build/Release-iphonesimulator/Flutter.build/dgph b/ios/build/Pods.build/Release-iphonesimulator/Flutter.build/dgph
deleted file mode 100644
index 39995fc18..000000000
Binary files a/ios/build/Pods.build/Release-iphonesimulator/Flutter.build/dgph and /dev/null differ
diff --git a/ios/build/Pods.build/Release-iphonesimulator/Pods-Runner.build/dgph b/ios/build/Pods.build/Release-iphonesimulator/Pods-Runner.build/dgph
deleted file mode 100644
index 39995fc18..000000000
Binary files a/ios/build/Pods.build/Release-iphonesimulator/Pods-Runner.build/dgph and /dev/null differ
diff --git a/ios/build/Pods.build/Release-iphonesimulator/Reachability.build/dgph b/ios/build/Pods.build/Release-iphonesimulator/Reachability.build/dgph
deleted file mode 100644
index 39995fc18..000000000
Binary files a/ios/build/Pods.build/Release-iphonesimulator/Reachability.build/dgph and /dev/null differ
diff --git a/ios/build/Pods.build/Release-iphonesimulator/connectivity.build/dgph b/ios/build/Pods.build/Release-iphonesimulator/connectivity.build/dgph
deleted file mode 100644
index 39995fc18..000000000
Binary files a/ios/build/Pods.build/Release-iphonesimulator/connectivity.build/dgph and /dev/null differ
diff --git a/ios/build/Pods.build/Release-iphonesimulator/path_provider.build/dgph b/ios/build/Pods.build/Release-iphonesimulator/path_provider.build/dgph
deleted file mode 100644
index 39995fc18..000000000
Binary files a/ios/build/Pods.build/Release-iphonesimulator/path_provider.build/dgph and /dev/null differ
diff --git a/ios/build/Pods.build/Release-iphonesimulator/share.build/dgph b/ios/build/Pods.build/Release-iphonesimulator/share.build/dgph
deleted file mode 100644
index 39995fc18..000000000
Binary files a/ios/build/Pods.build/Release-iphonesimulator/share.build/dgph and /dev/null differ
diff --git a/ios/build/Pods.build/Release-iphonesimulator/shared_preferences.build/dgph b/ios/build/Pods.build/Release-iphonesimulator/shared_preferences.build/dgph
deleted file mode 100644
index 39995fc18..000000000
Binary files a/ios/build/Pods.build/Release-iphonesimulator/shared_preferences.build/dgph and /dev/null differ
diff --git a/ios/build/Pods.build/Release-iphonesimulator/sqflite.build/dgph b/ios/build/Pods.build/Release-iphonesimulator/sqflite.build/dgph
deleted file mode 100644
index 39995fc18..000000000
Binary files a/ios/build/Pods.build/Release-iphonesimulator/sqflite.build/dgph and /dev/null differ
diff --git a/ios/build/Pods.build/Release-iphonesimulator/url_launcher.build/dgph b/ios/build/Pods.build/Release-iphonesimulator/url_launcher.build/dgph
deleted file mode 100644
index 39995fc18..000000000
Binary files a/ios/build/Pods.build/Release-iphonesimulator/url_launcher.build/dgph and /dev/null differ
diff --git a/ios/build/Runner.build/Release-iphoneos/Runner.build/dgph b/ios/build/Runner.build/Release-iphoneos/Runner.build/dgph
deleted file mode 100644
index 42898b763..000000000
Binary files a/ios/build/Runner.build/Release-iphoneos/Runner.build/dgph and /dev/null differ
diff --git a/l10n.yaml b/l10n.yaml
new file mode 100644
index 000000000..7312142f3
--- /dev/null
+++ b/l10n.yaml
@@ -0,0 +1,10 @@
+arb-dir: lib/src/l10n/arb
+template-arb-file: app_zh.arb
+output-localization-file: app_l10n.dart
+
+
+synthetic-package: false
+output-dir: lib/src/l10n/gen
+output-class: AppL10n
+nullable-getter: false
+untranslated-messages-file: desiredFileName.txt
\ No newline at end of file
diff --git a/lib/.gitignore b/lib/.gitignore
deleted file mode 100644
index 84ea85a96..000000000
--- a/lib/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/tools/
\ No newline at end of file
diff --git a/lib/app/blocs/color_change_bloc.dart b/lib/app/blocs/color_change_bloc.dart
deleted file mode 100644
index 39aae10f5..000000000
--- a/lib/app/blocs/color_change_bloc.dart
+++ /dev/null
@@ -1,32 +0,0 @@
-import 'dart:ui';
-
-import 'package:bloc/bloc.dart';
-import 'package:flutter_unit/app/res/cons.dart';
-import 'package:flutter_unit/widget_system/repositories/model/enums.dart';
-
-class SelectTab {
- final WidgetFamily family;
- final Color color;
-
- const SelectTab({required this.family, required this.color});
-
- Color get tabColor => Cons.tabColors[family.index];
-
- Color get nextTabColor => Cons.tabColors[(family.index+1)%Cons.tabColors.length];
-
-}
-
-class ColorChangeCubit extends Cubit {
- ColorChangeCubit(Color initColor)
- : super(SelectTab(
- family: WidgetFamily.statelessWidget,
- color: initColor,
- ));
-
- void change(Color color, {WidgetFamily? family}) => emit(SelectTab(
- color: color,
- family: family ?? state.family,
- ));
-
-
-}
diff --git a/lib/app/blocs/global/global_bloc.dart b/lib/app/blocs/global/global_bloc.dart
deleted file mode 100644
index a11f7e9c6..000000000
--- a/lib/app/blocs/global/global_bloc.dart
+++ /dev/null
@@ -1,71 +0,0 @@
-import 'package:flutter_bloc/flutter_bloc.dart';
-import 'package:flutter_unit/app/res/cons.dart';
-import 'package:flutter_unit/app/res/sp.dart';
-import 'package:flutter_unit/widget_system/repositories/repositories.dart';
-import 'package:shared_preferences/shared_preferences.dart';
-
-import 'global_event.dart';
-import 'global_state.dart';
-
-/// create by 张风捷特烈 on 2020-03-22
-/// contact me by email 1981462002@qq.com
-/// 说明: 全局信息的bloc
-
-class GlobalBloc extends Bloc {
-
- final AppStart storage;
-
- GlobalBloc(this.storage):super(GlobalState());
-
- Future get sp => LocalStorage.sp;
-
- @override
- Stream mapEventToState(GlobalEvent event) async* {
- // 程序初始化事件处理: 使用 AppStorage 进行初始化
- if (event is EventInitApp) {
- yield await storage.initApp();
- }
-
- // 切换字体事件处理 : 固化索引 + 产出新状态
- if (event is EventSwitchFontFamily) {
- int familyIndex = Cons.fontFamilySupport.indexOf(event.family);
- await sp..setInt(SP.fontFamily, familyIndex);
- yield state.copyWith(fontFamily: event.family);
- }
-
- // 切换主题色事件处理 : 固化索引 + 产出新状态
- if (event is EventSwitchThemeColor) {
- int themeIndex =
- Cons.themeColorSupport.keys.toList().indexOf(event.color);
- await sp
- ..setInt(SP.themeColorIndex, themeIndex);
- yield state.copyWith(themeColor: event.color);
- }
-
- // 切换背景显示事件处理 : 固化数据 + 产出新状态
- if (event is EventSwitchShowBg) {
- await sp
- ..setBool(SP.showBackground, event.show);
- yield state.copyWith(showBackGround: event.show);
- }
-
- // 切换背景显示事件处理 : 产出新状态
- if (event is EventSwitchShowOver) {
- yield state.copyWith(showPerformanceOverlay: event.show);
- }
-
- // 切换code样式事件处理 : 固化索引 + 产出新状态
- if (event is EventSwitchCoderTheme) {
- await sp
- ..setInt(SP.codeStyleIndex, event.codeStyleIndex);
- yield state.copyWith(codeStyleIndex: event.codeStyleIndex);
- }
-
- // 切换item样式事件处理 : 固化索引 + 产出新状态
- if (event is EventChangeItemStyle) {
- await sp
- ..setInt(SP.itemStyleIndex, event.index);
- yield state.copyWith(itemStyleIndex: event.index);
- }
- }
-}
diff --git a/lib/app/blocs/global/global_event.dart b/lib/app/blocs/global/global_event.dart
deleted file mode 100644
index 5117ac04e..000000000
--- a/lib/app/blocs/global/global_event.dart
+++ /dev/null
@@ -1,70 +0,0 @@
-import 'package:equatable/equatable.dart';
-import 'package:flutter/material.dart';
-
-abstract class GlobalEvent extends Equatable {
- const GlobalEvent();
-
- @override
- List get props => [];
-}
-
-class EventInitApp extends GlobalEvent {
- const EventInitApp();
-
- @override
- List get props => [];
-}
-
-class EventSwitchFontFamily extends GlobalEvent {
- final String family;
-
- const EventSwitchFontFamily(this.family);
-
- @override
- List get props => [family];
-}
-
-class EventSwitchThemeColor extends GlobalEvent {
- final MaterialColor color;
-
- const EventSwitchThemeColor(this.color);
-
- @override
- List get props => [color];
-}
-
-class EventSwitchCoderTheme extends GlobalEvent {
- final int codeStyleIndex;
-
- const EventSwitchCoderTheme(this.codeStyleIndex);
-
- @override
- List get props => [codeStyleIndex];
-}
-
-class EventSwitchShowBg extends GlobalEvent {
- final bool show;
-
- const EventSwitchShowBg(this.show);
-
- @override
- List get props => [show];
-}
-
-class EventSwitchShowOver extends GlobalEvent {
- final bool show;
-
- const EventSwitchShowOver(this.show);
-
- @override
- List get props => [show];
-}
-
-class EventChangeItemStyle extends GlobalEvent {
- final int index;
-
- const EventChangeItemStyle(this.index);
-
- @override
- List get props => [index];
-}
diff --git a/lib/app/blocs/global/global_state.dart b/lib/app/blocs/global/global_state.dart
deleted file mode 100644
index 1ca928a03..000000000
--- a/lib/app/blocs/global/global_state.dart
+++ /dev/null
@@ -1,67 +0,0 @@
-import 'package:equatable/equatable.dart';
-import 'package:flutter/material.dart';
-/// create by 张风捷特烈 on 2020-04-11
-/// contact me by email 1981462002@qq.com
-/// 说明: 全局状态类
-///
-class GlobalState extends Equatable {
- /// [fontFamily] 文字字体
- final String fontFamily;
-
- /// [themeColor] 主题色
- final MaterialColor themeColor;
-
- /// [showBackGround] 是否显示主页背景图
- final bool showBackGround;
-
- /// [codeStyleIndex] 代码样式 索引
- final int codeStyleIndex;
-
- /// [itemStyleIndex] 主页item样式 索引
- final int itemStyleIndex;
-
- /// [showPerformanceOverlay] 是否显示性能浮层
- final bool showPerformanceOverlay;
-
- const GlobalState({
- this.fontFamily = 'ComicNeue',
- this.themeColor = Colors.blue,
- this.showBackGround = true,
- this.codeStyleIndex = 0,
- this.itemStyleIndex = 0,
- this.showPerformanceOverlay = false,
- });
-
- @override
- List get props => [
- fontFamily,
- themeColor,
- showBackGround,
- codeStyleIndex,
- itemStyleIndex,
- showPerformanceOverlay
- ];
-
- GlobalState copyWith({
- double? height,
- String? fontFamily,
- MaterialColor? themeColor,
- bool? showBackGround,
- int? codeStyleIndex,
- int? itemStyleIndex,
- bool? showPerformanceOverlay,
- }) =>
- GlobalState(
- fontFamily: fontFamily ?? this.fontFamily,
- themeColor: themeColor ?? this.themeColor,
- showBackGround: showBackGround ?? this.showBackGround,
- codeStyleIndex: codeStyleIndex ?? this.codeStyleIndex,
- itemStyleIndex: itemStyleIndex ?? this.itemStyleIndex,
- showPerformanceOverlay: showPerformanceOverlay ?? this.showPerformanceOverlay,
- );
-
- @override
- String toString() {
- return 'GlobalState{fontFamily: $fontFamily, themeColor: $themeColor, showBackGround: $showBackGround, codeStyleIndex: $codeStyleIndex, itemStyleIndex: $itemStyleIndex, showPerformanceOverlay: $showPerformanceOverlay}';
- }
-}
diff --git a/lib/app/res/color_unit.dart b/lib/app/res/color_unit.dart
deleted file mode 100644
index 1c6866cec..000000000
--- a/lib/app/res/color_unit.dart
+++ /dev/null
@@ -1,20 +0,0 @@
-import 'package:flutter/material.dart';
-
-/// create by 张风捷特烈 on 2020/11/17
-/// contact me by email 1981462002@qq.com
-/// 说明:
-
-class ColorUnit{
-
- // 文字相关
- static const Color input_border_color = Color(0xffD0D7DD);
- static const Color text_color = Color(0xff323C47);
- static const Color input_hit_text_color = Color(0xff939EA7);
- static const Color head_text_color = Color(0xff666666);
-
- // 缺省相关
-
- static const Color error_color = Colors.red;
- static const Color warning_color = Colors.orangeAccent;
-
-}
\ No newline at end of file
diff --git a/lib/app/res/cons.dart b/lib/app/res/cons.dart
deleted file mode 100644
index 7ce800ad9..000000000
--- a/lib/app/res/cons.dart
+++ /dev/null
@@ -1,72 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_unit/components/permanent/code/highlighter_style.dart';
-
-class Cons {
-
- static const MENU_INFO = ["关于", "帮助", "问题反馈"]; //菜单栏
-
-
- static const List tabColors = [
- Color(0xff44D1FD),
- Color(0xffFD4F43),
- Color(0xffB375FF),
- Color(0xFF4CAF50),
- Color(0xFFFF9800),
- Color(0xFF00F1F1),
- Color(0xFFDBD83F),
- ];
-
- static const tabs = [
- 'Stles',
- 'Stful',
- 'Scrow',
- 'Mcrow',
- 'Sliver',
- 'Proxy',
- 'Other'
- ]; //标题列表
-
- static const fontFamilySupport = [
- 'local',
- 'ComicNeue',
- 'IndieFlower',
- 'BalooBhai2',
- 'Inconsolata',
- 'Neucha'
- ];
-
- static Map codeThemeSupport = {
- HighlighterStyle.fromColors(HighlighterStyle.gitHub):"GitHub - Power By 张风捷特烈",
- HighlighterStyle.fromColors(HighlighterStyle.darkColor):"捷特黑 - Power By 张风捷特烈",
- HighlighterStyle.fromColors(HighlighterStyle.lightColor):"捷特白 - Power By 张风捷特烈",
- HighlighterStyle.fromColors(HighlighterStyle.zenburn):"zenburn - Power By 张风捷特烈",
- HighlighterStyle.fromColors(HighlighterStyle.mf):"mf - Power By MF",
- HighlighterStyle.fromColors(HighlighterStyle.solarized):"cst - Power By cst",
- };
-
-
- static final themeColorSupport = {
- Colors.red: "毁灭之红",
- Colors.orange: "愤怒之橙",
- Colors.yellow: "警告之黄",
- Colors.green: "伪装之绿",
- Colors.blue: "冷漠之蓝",
- Colors.indigo: "无限之靛",
- Colors.purple: "神秘之紫",
-
- MaterialColor(0xff2D2D2D, {
- 50: Color(0xFF8A8A8A),
- 100: Color(0xFF747474),
- 200: Color(0xFF616161),
- 300: Color(0xFF484848),
- 400: Color(0xFF3D3D3D),
- 500: Color(0xff2D2D2D),
- 600: Color(0xFF252525),
- 700: Color(0xFF141414),
- 800: Color(0xFF050505),
- 900: Color(0xff000000),
- }): "归宿之黑"
- };
-
-}
-
diff --git a/lib/app/res/path_unit.dart b/lib/app/res/path_unit.dart
deleted file mode 100644
index 75cdce27b..000000000
--- a/lib/app/res/path_unit.dart
+++ /dev/null
@@ -1,19 +0,0 @@
-/// create by 张风捷特烈 on 2021/1/17
-/// contact me by email 1981462002@qq.com
-/// 说明:
-
-class PathUnit{
-
- static const baseUrl='http://119.45.173.197:8080/api/v1';
- // static const baseUrl='http://192.168.0.100:8080/api/v1';
-
- static const sendEmail = '/sendEmail/';
- static const register = '/register';
-
- static const categoryDataSync = '/categoryData/sync';
- static const categoryData = '/categoryData';
- static const appInfo = '/appInfo/name/FlutterUnit';
-
- static const login = '/login';
-
-}
\ No newline at end of file
diff --git a/lib/app/res/sp.dart b/lib/app/res/sp.dart
deleted file mode 100644
index b5aeb7df6..000000000
--- a/lib/app/res/sp.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-/// create by 张风捷特烈 on 2020-04-10
-/// contact me by email 1981462002@qq.com
-/// 说明:
-
-class SP{
-
- static const themeColorIndex = 'theme_color_index';
- static const showBackground = 'show_background';
- static const fontFamily = 'font_family';
- static const codeStyleIndex = 'code_style';
- static const itemStyleIndex = 'item_style_index';
-
-}
\ No newline at end of file
diff --git a/lib/app/res/str_unit.dart b/lib/app/res/str_unit.dart
deleted file mode 100644
index e15c25d7a..000000000
--- a/lib/app/res/str_unit.dart
+++ /dev/null
@@ -1,46 +0,0 @@
-/// create by 张风捷特烈 on 2020/11/29
-/// contact me by email 1981462002@qq.com
-/// 说明:
-
-class StrUnit {
-
- // 小文字大小
- static const String version = 'V1.5.1';
- static const String appName = 'Flutter Unit';
-
- static const String galleryInfo = """
-[
- {
- "image":"assets/images/anim_draw.webp",
- "name":"基础绘制",
- "info":"收录一些基础图形绘制案例,这些案例对初涉绘制的编程者会非常友好。通过这些案例,可以学会点、线、矩形、圆、圆弧、文字、图片等基本图形的绘制方法,了解 Canvas、Paint、Path 等绘制中核心对象的使用。"
- },
- {
- "image":"assets/images/draw_bg3.webp",
- "name":"动画手势",
- "info":"收录一些动画和手势的绘制案例,这些案例会让绘制更具有操作性。通过这些案例,可以学会动画和手势的使用,如滑动、旋转、缩放、移动等效果,让绘制不再只是静态展现。"
-
- },
- {
- "image":"assets/images/base_draw.webp",
- "name":"粒子绘制",
- "info":"收录一些粒子相关的绘制案例,这些案例将是绘制的顶级操作。通过这些案例,可以学会如何使用粒子来绘制惊艳的视觉效果,如粒子时钟、粒子爆炸、粒子背景等效果,让绘制拥有无限可能。"
-
- },
- {
- "image":"assets/images/draw_bg4.webp",
- "name":"趣味绘制",
- "info":"收录一些比较有趣的绘制案例,让我们一起在这里一起体验绘制的乐趣、编程的乐趣和智慧的乐趣吧。"
-
- },
- {
- "image":"assets/images/caver.webp",
- "name":"艺术画廊",
- "info":"收录一些殿堂级的绘制案例,这些案例将是绘制的巅峰作品,它们的没有任何的实用性,也不为任何需求而生,它们仅是因为存在而存在,是人类智慧和表达的媒介,称谓艺术。"
-
- }
-]
-""";
-
-
-}
\ No newline at end of file
diff --git a/lib/app/res/style/behavior/no_scroll_behavior.dart b/lib/app/res/style/behavior/no_scroll_behavior.dart
deleted file mode 100644
index 84c41938d..000000000
--- a/lib/app/res/style/behavior/no_scroll_behavior.dart
+++ /dev/null
@@ -1,11 +0,0 @@
-import 'package:flutter/material.dart';
-
-/// create by 张风捷特烈 on 2020/6/16
-/// contact me by email 1981462002@qq.com
-/// 说明:
-
-class NoScrollBehavior extends ScrollBehavior {
- @override
- Widget buildViewportChrome(
- BuildContext context, Widget child, AxisDirection axisDirection) => child;
-}
\ No newline at end of file
diff --git a/lib/app/res/style/gap.dart b/lib/app/res/style/gap.dart
deleted file mode 100644
index 73311737c..000000000
--- a/lib/app/res/style/gap.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-import 'package:flutter/material.dart';
-
-class Gap{
- static const Widget H5 = SizedBox(width: 5);
- static const Widget H10 = SizedBox(height: 10);
-
- static const Widget W5 = SizedBox(width: 5);
- static const Widget W10 = SizedBox(width: 10);
-
-}
\ No newline at end of file
diff --git a/lib/app/res/style/unit_color.dart b/lib/app/res/style/unit_color.dart
deleted file mode 100644
index bdb35a77c..000000000
--- a/lib/app/res/style/unit_color.dart
+++ /dev/null
@@ -1,71 +0,0 @@
-import 'package:flutter/material.dart';
-
-/// create by 张风捷特烈 on 2020-04-19
-/// contact me by email 1981462002@qq.com
-/// 说明:
-
-class UnitColor {
- static const collectColorSupport = [
- Color(0xFFF2F2F2),
- Colors.black,
- Colors.red,
- Colors.orange,
- Colors.yellow,
- Colors.green,
- Colors.blue,
- Colors.indigo,
- Colors.purple,
-
- Colors.cyanAccent,
- Color(0xffd1d08f),
- Colors.pink,
- Colors.amber,
- Colors.lime,
- Colors.teal,
- Colors.cyan,
- Color(0xff586CF2),
- Colors.purpleAccent,
- ];
-
- static const int primaryIntValue = 0xFF24292E;
-
- static const MaterialColor primarySwatch = const MaterialColor(
- primaryIntValue,
- const {
- 50: const Color(primaryIntValue),
- 100: const Color(primaryIntValue),
- 200: const Color(primaryIntValue),
- 300: const Color(primaryIntValue),
- 400: const Color(primaryIntValue),
- 500: const Color(primaryIntValue),
- 600: const Color(primaryIntValue),
- 700: const Color(primaryIntValue),
- 800: const Color(primaryIntValue),
- 900: const Color(primaryIntValue),
- },
- );
-
- static const String primaryValueString = "#24292E";
- static const String primaryLightValueString = "#42464b";
- static const String primaryDarkValueString = "#121917";
- static const String miWhiteString = "#ececec";
- static const String actionBlueString = "#267aff";
- static const String webDraculaBackgroundColorString = "#282a36";
-
- static const Color primaryValue = Color(0xFF24292E);
- static const Color primaryLightValue = Color(0xFF42464b);
- static const Color primaryDarkValue = Color(0xFF121917);
-
- static const Color cardWhite = Color(0xFFFFFFFF);
- static const Color textWhite = Color(0xFFFFFFFF);
- static const Color miWhite = Color(0xffececec);
- static const Color white = Color(0xFFFFFFFF);
- static const Color actionBlue = Color(0xff267aff);
- static const Color subTextColor = Color(0xff959595);
- static const Color subLightTextColor = Color(0xffc4c4c4);
-
- static const Color mainBackgroundColor = miWhite;
-
- static const Color mainTextColor = primaryDarkValue;
- static const Color textColorWhite = white;
-}
diff --git a/lib/app/res/style/unit_text_style.dart b/lib/app/res/style/unit_text_style.dart
deleted file mode 100644
index 76af312f1..000000000
--- a/lib/app/res/style/unit_text_style.dart
+++ /dev/null
@@ -1,178 +0,0 @@
-import 'package:flutter/material.dart';
-
-import 'unit_color.dart';
-
-///文本样式
-class TStyleUnit {
- static const lagerTextSize = 30.0;
- static const bigTextSize = 23.0;
- static const normalTextSize = 18.0;
- static const middleTextWhiteSize = 16.0;
- static const smallTextSize = 14.0;
- static const minTextSize = 12.0;
-
- static const minText = TextStyle(
- color: UnitColor.subLightTextColor,
- fontSize: minTextSize,
- );
-
- static const splashShadows = TextStyle(
- color: Colors.grey,
- shadows: [
- Shadow(
- color: Colors.black,
- blurRadius: 1,
- offset: Offset(0.1, 0.1))
- ],
- fontSize: 12);
-
- static const smallTextWhite = TextStyle(
- color: UnitColor.textColorWhite,
- fontSize: smallTextSize,
- );
-
- static const shadowTextStyle = TextStyle(color: Colors.grey, shadows: [
- Shadow(color: Colors.white, offset: Offset(.5, .5), blurRadius: .5)
- ]);
-
- static const smallText = TextStyle(
- color: UnitColor.mainTextColor,
- fontSize: smallTextSize,
- );
-
- static const smallTextBold = TextStyle(
- color: UnitColor.mainTextColor,
- fontSize: smallTextSize,
- fontWeight: FontWeight.bold,
- );
-
- static const smallSubLightText = TextStyle(
- color: UnitColor.subLightTextColor,
- fontSize: smallTextSize,
- );
-
- static const smallActionLightText = TextStyle(
- color: UnitColor.actionBlue,
- fontSize: smallTextSize,
- );
-
- static const smallMiLightText = TextStyle(
- color: UnitColor.miWhite,
- fontSize: smallTextSize,
- );
-
- static const smallSubText = TextStyle(
- color: UnitColor.subTextColor,
- fontSize: smallTextSize,
- );
-
- static const middleText = TextStyle(
- color: UnitColor.mainTextColor,
- fontSize: middleTextWhiteSize,
- );
-
- static const middleTextWhite = TextStyle(
- color: UnitColor.textColorWhite,
- fontSize: middleTextWhiteSize,
- );
-
- static const middleSubText = TextStyle(
- color: UnitColor.subTextColor,
- fontSize: middleTextWhiteSize,
- );
-
- static const middleSubLightText = TextStyle(
- color: UnitColor.subLightTextColor,
- fontSize: middleTextWhiteSize,
- );
-
- static const middleTextBold = TextStyle(
- color: UnitColor.mainTextColor,
- fontSize: middleTextWhiteSize,
- fontWeight: FontWeight.bold,
- );
-
- static const middleTextWhiteBold = TextStyle(
- color: UnitColor.textColorWhite,
- fontSize: middleTextWhiteSize,
- fontWeight: FontWeight.bold,
- );
-
- static const middleSubTextBold = TextStyle(
- color: UnitColor.subTextColor,
- fontSize: middleTextWhiteSize,
- fontWeight: FontWeight.bold,
- );
-
- static const normalText = TextStyle(
- color: UnitColor.mainTextColor,
- fontSize: normalTextSize,
- );
-
- static const normalTextBold = TextStyle(
- color: UnitColor.mainTextColor,
- fontSize: normalTextSize,
- fontWeight: FontWeight.bold,
- );
-
- static const normalSubText = TextStyle(
- color: UnitColor.subTextColor,
- fontSize: normalTextSize,
- );
-
- static const normalTextWhite = TextStyle(
- color: UnitColor.textColorWhite,
- fontSize: normalTextSize,
- );
-
- static const normalTextMitWhiteBold = TextStyle(
- color: UnitColor.miWhite,
- fontSize: normalTextSize,
- fontWeight: FontWeight.bold,
- );
-
- static const normalTextActionWhiteBold = TextStyle(
- color: UnitColor.actionBlue,
- fontSize: normalTextSize,
- fontWeight: FontWeight.bold,
- );
-
- static const normalTextLight = TextStyle(
- color: UnitColor.primaryLightValue,
- fontSize: normalTextSize,
- );
-
- static const largeText = TextStyle(
- color: UnitColor.mainTextColor,
- fontSize: bigTextSize,
- );
-
- static const largeTextBold = TextStyle(
- color: UnitColor.mainTextColor,
- fontSize: bigTextSize,
- fontWeight: FontWeight.bold,
- );
-
- static const largeTextWhite = TextStyle(
- color: UnitColor.textColorWhite,
- fontSize: bigTextSize,
- );
-
- static const largeTextWhiteBold = TextStyle(
- color: UnitColor.textColorWhite,
- fontSize: bigTextSize,
- fontWeight: FontWeight.bold,
- );
-
- static const largeLargeTextWhite = TextStyle(
- color: UnitColor.textColorWhite,
- fontSize: lagerTextSize,
- fontWeight: FontWeight.bold,
- );
-
- static const largeLargeText = TextStyle(
- color: UnitColor.primaryValue,
- fontSize: lagerTextSize,
- fontWeight: FontWeight.bold,
- );
-}
diff --git a/lib/app/res/style_unit.dart b/lib/app/res/style_unit.dart
deleted file mode 100644
index 8382da53f..000000000
--- a/lib/app/res/style_unit.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-import 'package:flutter/material.dart';
-
-import 'color_unit.dart';
-import 'size_unit.dart';
-
-/// create by 张风捷特烈 on 2020/11/17
-/// contact me by email 1981462002@qq.com
-/// 说明:
-
-class TextStyleUnit {
- static const TextStyle hintStyle = const TextStyle(
- color: ColorUnit.input_hit_text_color,
- fontSize: SizeUnit.input_hit_text_size);
-
- static const TextStyle primary = const TextStyle(
- color: ColorUnit.text_color, fontSize: SizeUnit.input_text_size);
-
- static const TextStyle headTextStyle = const TextStyle(
- color: ColorUnit.head_text_color, fontSize: SizeUnit.head_text_size);
-
- static const TextStyle smallSubTextStyle = const TextStyle(
- color: ColorUnit.input_hit_text_color,
- fontSize: SizeUnit.small_text_size);
-
- static const TextStyle bigTextStyle = const TextStyle(
- color: ColorUnit.text_color, fontSize: SizeUnit.big_text_size);
-}
diff --git a/lib/app/res/toly_icon.dart b/lib/app/res/toly_icon.dart
deleted file mode 100644
index 3b4c19719..000000000
--- a/lib/app/res/toly_icon.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-import 'package:flutter/widgets.dart';
-//Power By 张风捷特烈--- Generated file. Do not edit.
-
-class TolyIcon {
-
- TolyIcon._();
-static const IconData upload_success = const IconData( 0xe60b, fontFamily: "TolyIcon");
-static const IconData download = const IconData( 0xea51, fontFamily: "TolyIcon");
-static const IconData upload = const IconData( 0xea52, fontFamily: "TolyIcon");
-static const IconData error = const IconData( 0xe614, fontFamily: "TolyIcon");
-static const IconData dingzhi1 = const IconData( 0xe60e, fontFamily: "TolyIcon");
-static const IconData icon_collect = const IconData( 0xe672, fontFamily: "TolyIcon");
-static const IconData yonghu = const IconData( 0xe619, fontFamily: "TolyIcon");
-static const IconData icon_common = const IconData( 0xe634, fontFamily: "TolyIcon");
-static const IconData icon_see = const IconData( 0xe608, fontFamily: "TolyIcon");
-static const IconData icon_issues = const IconData( 0xe7a7, fontFamily: "TolyIcon");
-static const IconData icon_fork = const IconData( 0xe623, fontFamily: "TolyIcon");
-static const IconData icon_github_star = const IconData( 0xe7df, fontFamily: "TolyIcon");
-static const IconData icon_show = const IconData( 0xe648, fontFamily: "TolyIcon");
-static const IconData icon_hide = const IconData( 0xe649, fontFamily: "TolyIcon");
-static const IconData icon_email = const IconData( 0xe694, fontFamily: "TolyIcon");
-static const IconData icon_github = const IconData( 0xe689, fontFamily: "TolyIcon");
-static const IconData icon_juejin = const IconData( 0xe601, fontFamily: "TolyIcon");
-static const IconData icon_share = const IconData( 0xe613, fontFamily: "TolyIcon");
-static const IconData icon_background = const IconData( 0xe60a, fontFamily: "TolyIcon");
-static const IconData icon_code = const IconData( 0xe70b, fontFamily: "TolyIcon");
-static const IconData icon_item = const IconData( 0xe66f, fontFamily: "TolyIcon");
-static const IconData icon_kafei = const IconData( 0xe6aa, fontFamily: "TolyIcon");
-static const IconData icon_tag = const IconData( 0xe6e7, fontFamily: "TolyIcon");
-static const IconData icon_them = const IconData( 0xe6c2, fontFamily: "TolyIcon");
-static const IconData icon_bug = const IconData( 0xe7af, fontFamily: "TolyIcon");
-static const IconData icon_layout = const IconData( 0xe631, fontFamily: "TolyIcon");
-static const IconData icon_sound = const IconData( 0xe606, fontFamily: "TolyIcon");
-static const IconData icon_search = const IconData( 0xe604, fontFamily: "TolyIcon");
-static const IconData icon_star_ok = const IconData( 0xe6ae, fontFamily: "TolyIcon");
-static const IconData icon_star = const IconData( 0xe609, fontFamily: "TolyIcon");
-static const IconData icon_star_add = const IconData( 0xe68e, fontFamily: "TolyIcon");
-}
\ No newline at end of file
diff --git a/lib/app/router/router_utils.dart b/lib/app/router/router_utils.dart
deleted file mode 100644
index 0370ece77..000000000
--- a/lib/app/router/router_utils.dart
+++ /dev/null
@@ -1,163 +0,0 @@
-import 'package:flutter/material.dart';
-
-//缩放路由动画
-class ScaleRouter extends PageRouteBuilder {
- final Widget child;
- final int durationMs;
- final Curve curve;
- ScaleRouter({required this.child, this.durationMs = 500,this.curve=Curves.fastOutSlowIn})
- : super(
- pageBuilder: (context, animation, secondaryAnimation) => child,
- transitionDuration: Duration(milliseconds: durationMs),
- transitionsBuilder: (context, a1, a2, child) =>
- ScaleTransition(
- scale: Tween(begin: 0.0, end: 1.0).animate(
- CurvedAnimation(parent: a1, curve: curve)),
- child: child,
- ),
- );
-}
-//渐变透明路由动画
-class FadeRouter extends PageRouteBuilder {
- final Widget child;
- final int durationMs;
- final Curve curve;
- FadeRouter({required this.child, this.durationMs = 500,this.curve=Curves.fastOutSlowIn})
- : super(
- pageBuilder: (context, animation, secondaryAnimation) => child,
- transitionDuration: Duration(milliseconds: durationMs),
- transitionsBuilder: (context, a1, a2, child) =>
- FadeTransition(
- opacity: Tween(begin: 0.1, end: 1.0).animate(
- CurvedAnimation(parent: a1, curve:curve,)),
- child: child,
- ));
-}
-
-//旋转路由动画
-class RotateRouter extends PageRouteBuilder {
- final Widget child;
- final int durationMs;
- final Curve curve;
- RotateRouter({required this.child, this.durationMs = 500,this.curve=Curves.fastOutSlowIn})
- : super(
- pageBuilder: (context, animation, secondaryAnimation) => child,
- transitionDuration: Duration(milliseconds: durationMs),
- transitionsBuilder: (context, a1, a2, child) =>
- RotationTransition(
- turns: Tween(begin: 0.1, end: 1.0).animate(
- CurvedAnimation(parent: a1, curve:curve,)),
- child: child,
- ));
-}
-
-//右--->左
-class Right2LeftRouter extends PageRouteBuilder {
- final Widget child;
- final int durationMs;
- final Curve curve;
- Right2LeftRouter({required this.child,this.durationMs=500,this.curve=Curves.fastOutSlowIn})
- :super(
- transitionDuration:Duration(milliseconds: durationMs),
- pageBuilder:(ctx,a1,a2)=>child,
- transitionsBuilder:(ctx,a1,a2, child,) =>
- SlideTransition(
- child: child,
- position: Tween(
- begin: Offset(1.0, 0.0), end: Offset(0.0, 0.0),).animate(
- CurvedAnimation(parent: a1, curve: curve)),
- ));
-}
-
-//左--->右
-class Left2RightRouter extends PageRouteBuilder {
- final Widget child;
- final int durationMs;
- final Curve curve;
-
- Left2RightRouter({required this.child,this.durationMs=500,this.curve=Curves.fastOutSlowIn})
- :assert(true),super(
- transitionDuration:Duration(milliseconds: durationMs),
- pageBuilder:(ctx,a1,a2){return child;},
- transitionsBuilder:(ctx,a1,a2,child,) {
- return SlideTransition(
- position: Tween(
- begin: Offset(-1.0, 0.0), end: Offset(0.0, 0.0),).animate(
- CurvedAnimation(parent: a1, curve: curve)),
- child: child
- );
- });
-}
-
-//上--->下
-class Top2BottomRouter extends PageRouteBuilder {
- final Widget child;
- final int durationMs;
- final Curve curve;
- Top2BottomRouter({required this.child,this.durationMs=500,this.curve=Curves.fastOutSlowIn})
- :super(
- transitionDuration:Duration(milliseconds: durationMs),
- pageBuilder:(ctx,a1,a2){return child;},
- transitionsBuilder:(ctx,a1,a2, child,) {
- return SlideTransition(
- position: Tween(
- begin: Offset(0.0,-1.0), end: Offset(0.0, 0.0),).animate(
- CurvedAnimation(parent: a1, curve: curve)),
- child: child
- );
- });
-}
-
-//下--->上
-class Bottom2TopRouter extends PageRouteBuilder {
- final Widget child;
- final int durationMs;
- final Curve curve;
- Bottom2TopRouter({required this.child,this.durationMs=500,this.curve=Curves.fastOutSlowIn})
- :super(
- transitionDuration:Duration(milliseconds: durationMs),
- pageBuilder:(ctx,a1,a2)=> child,
- transitionsBuilder:(ctx,a1,a2, child,) {
- return SlideTransition(
- position: Tween(
- begin: Offset(0.0, 1.0), end: Offset(0.0, 0.0),).animate(
- CurvedAnimation(parent: a1, curve: curve)),
- child: child
- );
- });
-}
-
-//缩放+透明+旋转路由动画
-class ScaleFadeRotateRouter extends PageRouteBuilder {
- final Widget child;
- final int durationMs;
- final Curve curve;
- ScaleFadeRotateRouter({required this.child, this.durationMs = 1000,this.curve=Curves.fastOutSlowIn}) : super(
- transitionDuration: Duration(milliseconds: durationMs),
- pageBuilder: (ctx, a1, a2)=>child,//页面
- transitionsBuilder: (ctx, a1, a2, Widget child,) =>
- RotationTransition(//旋转动画
- turns: Tween(begin: 0.0, end: 1.0).animate(CurvedAnimation(
- parent: a1,
- curve: curve,
- )),
- child: ScaleTransition(//缩放动画
- scale: Tween(begin: 0.0, end: 1.0).animate(
- CurvedAnimation(parent: a1, curve: curve)),
- child: FadeTransition(opacity://透明度动画
- Tween(begin: 0.5, end: 1.0).animate(CurvedAnimation(parent: a1, curve: curve)),
- child: child,),
- ),
- ));
-}
-//无动画
-class NoAnimRouter extends PageRouteBuilder {
- final Widget child;
- NoAnimRouter({required this.child})
- : super(
- opaque: false,
- pageBuilder: (context, animation, secondaryAnimation) => child,
- transitionDuration: Duration(milliseconds: 0),
- transitionsBuilder:
- (context, animation, secondaryAnimation, child) => child);
-}
diff --git a/lib/app/router/unit_router.dart b/lib/app/router/unit_router.dart
deleted file mode 100644
index 90c3d3f86..000000000
--- a/lib/app/router/unit_router.dart
+++ /dev/null
@@ -1,132 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_unit/app/views/about/about_app_page.dart';
-import 'package:flutter_unit/app/views/about/about_me_page.dart';
-import 'package:flutter_unit/app/views/about/version_info.dart';
-import 'package:flutter_unit/app/views/data_manage/data_manage_page.dart';
-import 'package:flutter_unit/app/views/navigation/unit_navigation.dart';
-import 'package:flutter_unit/app/views/setting/code_style_setting.dart';
-import 'package:flutter_unit/app/views/setting/font_setting.dart';
-import 'package:flutter_unit/app/views/setting/item_style_setting.dart';
-import 'package:flutter_unit/app/views/setting/setting_page.dart';
-import 'package:flutter_unit/app/views/setting/theme_color_setting.dart';
-import 'package:flutter_unit/app/views/unit_todo/attr_unit_page.dart';
-import 'package:flutter_unit/app/views/unit_todo/layout_unit_page.dart';
-import 'package:flutter_unit/app/views/unit_todo/point_unit_page.dart';
-import 'package:flutter_unit/painter_system/gallery_page.dart';
-import 'package:flutter_unit/point_system/views/issues_point/issues_detail.dart';
-import 'package:flutter_unit/point_system/views/issues_point/issues_point_page.dart';
-import 'package:flutter_unit/user_system/pages/login/login_page.dart';
-import 'package:flutter_unit/user_system/pages/register/register_page.dart';
-import 'package:flutter_unit/widget_system/repositories/model/category_model.dart';
-import 'package:flutter_unit/widget_system/repositories/model/widget_model.dart';
-import 'package:flutter_unit/widget_system/views/widget_system_view.dart';
-
-import 'router_utils.dart';
-
-class UnitRouter {
- static const String widget_detail = '/widget_detail';
-
- static const String detail = 'detail';
- static const String search = 'search_bloc';
- static const String nav = 'nav';
-
- static const String collect = 'CollectPage';
- static const String point = 'IssuesPointPage';
- static const String point_detail = 'IssuesDetailPage';
-
- static const String setting = 'SettingPage';
- static const String font_setting = 'FountSettingPage';
- static const String theme_color_setting = 'ThemeColorSettingPage';
- static const String code_style_setting = 'CodeStyleSettingPage';
- static const String item_style_setting = 'ItemStyleSettingPage';
- static const String version_info = 'VersionInfo';
- static const String login = 'login';
-
- static const String category_show = 'CategoryShow';
- static const String issues_point = 'IssuesPointPage';
-
- static const String attr = 'AttrUnitPage';
- static const String bug = 'BugUnitPage';
- static const String galley = 'GalleryPage';
- static const String layout = 'LayoutUnitPage';
- static const String about_me = 'AboutMePage';
- static const String about_app = 'AboutAppPage';
- static const String register = 'register';
-
- static const String data_manage = 'DataManagePage';
-
- static Route generateRoute(RouteSettings settings) {
- switch (settings.name) {
- //
- case nav:
- return Left2RightRouter(child: const UnitNavigation());
-
- // 组件详情页
- case widget_detail:
- return Right2LeftRouter(
- child: WidgetDetailPage(model: settings.arguments as WidgetModel));
-
- case search:
- return Right2LeftRouter(child: SearchPage());
- case collect:
- return Right2LeftRouter(child: CollectPage());
-
- case setting:
- return Right2LeftRouter(child: SettingPage());
- case data_manage:
- return Right2LeftRouter(child: DataManagePage());
- case font_setting:
- return Right2LeftRouter(child: FontSettingPage());
- case theme_color_setting:
- return Right2LeftRouter(child: ThemeColorSettingPage());
- case code_style_setting:
- return Right2LeftRouter(child: CodeStyleSettingPage());
- case item_style_setting:
- return Right2LeftRouter(child: ItemStyleSettingPage());
-
- case version_info:
- return Right2LeftRouter(child: VersionInfo());
-
- case version_info:
- return Right2LeftRouter(child: VersionInfo());
-
- case issues_point:
- return Right2LeftRouter(child: IssuesPointPage());
- case login:
- return Right2LeftRouter(child: LoginPage());
-
- case register:
- return Right2LeftRouter(child: RegisterPage());
-
- case attr:
- return Right2LeftRouter(child: AttrUnitPage());
- case bug:
- return Right2LeftRouter(child: BugUnitPage());
- case galley:
- return Right2LeftRouter(child: GalleryPage());
- case layout:
- return Right2LeftRouter(child: LayoutUnitPage());
- case about_app:
- return Right2LeftRouter(child: AboutAppPage());
- case about_me:
- return Right2LeftRouter(child: AboutMePage());
-
- case point_detail:
- return Right2LeftRouter(child: IssuesDetailPage());
-
- case category_show:
- return Right2LeftRouter(
- child: CategoryShow(
- model: settings.arguments as CategoryModel,
- ));
-
- default:
- return MaterialPageRoute(
- builder: (_) => Scaffold(
- body: Center(
- child: Text('No route defined for ${settings.name}'),
- ),
- ));
- }
- }
-}
diff --git a/lib/app/utils/Toast.dart b/lib/app/utils/Toast.dart
deleted file mode 100644
index 032ffbb0f..000000000
--- a/lib/app/utils/Toast.dart
+++ /dev/null
@@ -1,33 +0,0 @@
-import 'package:flutter/cupertino.dart';
-import 'package:flutter/material.dart';
-
-class Toast {
- static toast(BuildContext context, String msg,
- {duration = const Duration(milliseconds: 600),
- Color? color,
- SnackBarAction? action}) {
-
- Scaffold.of(context).showSnackBar(SnackBar(
- content: Text(msg),
- duration: duration,
- action: action,
- backgroundColor: color??Theme.of(context).primaryColor,
- ));
- }
-
- static void error(BuildContext context,String msg){
- toast(context,msg, color:Colors.red, );
- }
-
- static void warning(BuildContext context,String msg){
- toast(context,msg, color:Colors.orange, );
- }
-
- static void success(BuildContext context,String msg){
- toast(context,msg, color:Theme.of(context).primaryColor, );
- }
-
- static void green(BuildContext context,String msg){
- toast(context,msg, color:Colors.green, );
- }
-}
diff --git a/lib/app/utils/convert.dart b/lib/app/utils/convert.dart
deleted file mode 100644
index c02c32668..000000000
--- a/lib/app/utils/convert.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-import 'package:flutter_unit/widget_system/repositories/model/enums.dart';
-import 'package:flutter_unit/painter_system/gallery_factory.dart';
-
-/// create by 张风捷特烈 on 2020-03-07
-/// contact me by email 1981462002@qq.com
-/// 说明:
-
-class Convert {
- static WidgetFamily toFamily(int id) {
- switch (id) {
- case 0:
- return WidgetFamily.statelessWidget;
- case 1:
- return WidgetFamily.statefulWidget;
- case 2:
- return WidgetFamily.singleChildRenderObjectWidget;
- case 3:
- return WidgetFamily.multiChildRenderObjectWidget;
- case 4:
- return WidgetFamily.sliver;
- case 5:
- return WidgetFamily.proxyWidget;
- case 6:
- return WidgetFamily.other;
- default:
- return WidgetFamily.statelessWidget;
- }
- }
-
- static Map galleryTypeMap = {
- GalleryType.base: "基础绘制",
- GalleryType.fun: "趣味绘制",
- GalleryType.particle: "粒子绘制",
- GalleryType.anim: "动画手势",
- GalleryType.art: "艺术画廊",
- };
-
- static String convertFileSize(int size){
- if(size==null) return '0 kb';
- double result = size / 1024.0;
- if(result<1024){
- return "${result.toStringAsFixed(2)}Kb";
- }else if(result>1024&&result<1024*1024){
- return "${(result/1024).toStringAsFixed(2)}Mb";
- }else{
- return "${(result/1024/1024).toStringAsFixed(2)}Gb";
- }
- }
-
-
-}
diff --git a/lib/app/utils/http_utils/http_util.dart b/lib/app/utils/http_utils/http_util.dart
deleted file mode 100644
index 4ae2b5259..000000000
--- a/lib/app/utils/http_utils/http_util.dart
+++ /dev/null
@@ -1,66 +0,0 @@
-
-import 'package:dio/dio.dart';
-import 'package:flutter_unit/app/res/path_unit.dart';
-
-import 'logs_interceptor.dart';
-import 'token_interceptor.dart';
-
-const int _kReceiveTimeout = 5000;
-const int _kSendTimeout = 5000;
-const int _kConnectTimeout = 5000;
-
-class HttpUtil {
- static HttpUtil _instance = HttpUtil._internal();
- Dio? _dio;
-
- static const CODE_SUCCESS = 200;
- static const CODE_TIME_OUT = -1;
-
- factory HttpUtil() => _instance;
- TokenInterceptors? tokenInterceptors;
-
- ///通用全局单例,第一次使用时初始化
- HttpUtil._internal() {
- if (null == _dio) {
- _dio = Dio(BaseOptions(
- baseUrl: PathUnit.baseUrl,
- connectTimeout: _kReceiveTimeout,
- receiveTimeout: _kConnectTimeout,
- sendTimeout: _kSendTimeout,
- ));
- _dio!.interceptors.add(LogsInterceptors());
- // _dio.interceptors.add(ResponseInterceptors());
- }
- }
-
- static HttpUtil getInstance() {
- return _instance._default();
-
- }
-
- Dio get client => _dio!;
-
- void setToken(String token){
- print('---token---$token-------');
- tokenInterceptors = TokenInterceptors(token: token);
- _dio!.interceptors.add(tokenInterceptors!);
- }
- void deleteToken(){
- _dio!.interceptors.remove(tokenInterceptors);
- }
-
- void rebase(String baseIp) {
- _dio!.options.baseUrl = baseIp;
- }
-
- //一般请求,默认域名
- HttpUtil _default() {
- if (_dio != null) {
- _dio!.options.baseUrl=PathUnit.baseUrl;
- _dio!.options.headers = {};
- }
- return this;
- }
-}
-
-
diff --git a/lib/app/utils/http_utils/result_bean.dart b/lib/app/utils/http_utils/result_bean.dart
deleted file mode 100644
index 5f3bdebf7..000000000
--- a/lib/app/utils/http_utils/result_bean.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-class ResultBean {
- T? data;
- bool status;
- String msg;
-
- ResultBean({this.data, this.status=false, this.msg=''});
-
- @override
- String toString() {
- return 'RepResult{data: $data, status: $status, msg:$msg}';
- }
-
- static ResultBean fromData(dynamic data) {
- return ResultBean(
- msg: data['msg'],
- data: data['data'],
- status: data['status'],
- );
- }
-
- static ResultBean error(String msg) {
- return ResultBean(
- msg: msg,
- data: null,
- status: false,
- );
- }
-
- static ResultBean ok(T? data) {
- return ResultBean(
- msg: '请求成功',
- data: data,
- status: true,
- );
- }
-}
diff --git a/lib/app/utils/pather.dart b/lib/app/utils/pather.dart
deleted file mode 100644
index f4ed2dd1f..000000000
--- a/lib/app/utils/pather.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-import 'dart:math';
-
-import 'package:flutter/cupertino.dart';
-
-class Pather {
- Pather._();
-
- static Pather create = Pather._();
-
- Path _path = Path();
-
- Path nStarPath(int num, double R, double r, {dx = 0, dy = 0}) {
- _path.reset();//重置路径
- double perRad = 2 * pi / num;//每份的角度
- double radA = perRad / 2 / 2;//a角
- double radB = 2 * pi / (num - 1) / 2 - radA / 2 + radA;//起始b角
- _path.moveTo(cos(radA) * R + dx, -sin(radA) * R + dy);//移动到起点
- for (int i = 0; i < num; i++) {//循环生成点,路径连至
- _path.lineTo(cos(radA + perRad * i) * R + dx, -sin(radA + perRad * i) * R + dy);
- _path.lineTo(cos(radB + perRad * i) * r + dx, -sin(radB + perRad * i) * r + dy);
- }
- _path.close();
- return _path;
- }
-}
diff --git a/lib/app/utils/stream_ext/backpressure.dart b/lib/app/utils/stream_ext/backpressure.dart
deleted file mode 100644
index 47d14d3d3..000000000
--- a/lib/app/utils/stream_ext/backpressure.dart
+++ /dev/null
@@ -1,356 +0,0 @@
-import 'dart:async';
-import 'dart:collection';
-
-import 'forwarding_stream.dart';
-
-
-/// A [Sink] that supports event hooks.
-///
-/// This makes it suitable for certain rx transformers that need to
-/// take action after onListen, onPause, onResume or onCancel.
-///
-/// The [ForwardingSink] has been designed to handle asynchronous events from
-/// [Stream]s. See, for example, [Stream.eventTransformed] which uses
-/// `EventSink`s to transform events.
-abstract class ForwardingSink {
- /// Handle data event
- void add(EventSink sink, T data);
-
- /// Handle error event
- void addError(EventSink sink, dynamic error, [StackTrace st]);
-
- /// Handle close event
- void close(EventSink sink);
-
- /// Fires when a listener subscribes on the underlying [Stream].
- void onListen(EventSink sink);
-
- /// Fires when a subscriber pauses.
- void onPause(EventSink sink, [Future resumeSignal]);
-
- /// Fires when a subscriber resumes after a pause.
- void onResume(EventSink sink);
-
- /// Fires when a subscriber cancels.
- FutureOr onCancel(EventSink sink);
-}
-
-
-// import 'package:rxdart/src/utils/forwarding_sink.dart';
-// import 'package:rxdart/src/utils/forwarding_stream.dart';
-
-/// The strategy that is used to determine how and when a new window is created.
-enum WindowStrategy {
- /// cancels the open window (if any) and immediately opens a fresh one.
- everyEvent,
-
- /// waits until the current open window completes, then when the
- /// source [Stream] emits a next event, it opens a new window.
- eventAfterLastWindow,
-
- /// opens a recurring window right after the very first event on
- /// the source [Stream] is emitted.
- firstEventOnly,
-
- /// does not open any windows, rather all events are buffered and emitted
- /// whenever the handler triggers, after this trigger, the buffer is cleared.
- onHandler
-}
-
-class _BackpressureStreamSink implements ForwardingSink {
- final WindowStrategy _strategy;
- final Stream Function(S event)? _windowStreamFactory;
- final T Function(S event)? _onWindowStart;
- final T Function(List queue)? _onWindowEnd;
- final int _startBufferEvery;
- final bool Function(List queue)? _closeWindowWhen;
- final bool _ignoreEmptyWindows;
- final bool _dispatchOnClose;
- final queue = [];
- var skip = 0;
- var _hasData = false;
- StreamSubscription? _windowSubscription;
-
- _BackpressureStreamSink(
- this._strategy,
- this._windowStreamFactory,
- this._onWindowStart,
- this._onWindowEnd,
- this._startBufferEvery,
- this._closeWindowWhen,
- this._ignoreEmptyWindows,
- this._dispatchOnClose);
-
- @override
- void add(EventSink sink, S data) {
- _hasData = true;
- maybeCreateWindow(data, sink);
-
- if (skip == 0) {
- queue.add(data);
- }
-
- if (skip > 0) {
- skip--;
- }
-
- maybeCloseWindow(sink);
- }
-
- @override
- void addError(EventSink sink, dynamic e, [StackTrace? st]) => sink.addError(e, st);
-
- @override
- void close(EventSink sink) {
- // treat the final event as a Window that opens
- // and immediately closes again
- if (_dispatchOnClose && queue.isNotEmpty) {
- resolveWindowStart(queue.last, sink);
- }
-
- resolveWindowEnd(sink, true);
-
- queue.clear();
-
- _windowSubscription?.cancel();
- sink.close();
- }
-
- @override
- FutureOr onCancel(EventSink sink) => _windowSubscription?.cancel();
-
- @override
- void onListen(EventSink sink) {}
-
- @override
- void onPause(EventSink sink, [Future? resumeSignal]) =>
- _windowSubscription?.pause(resumeSignal);
-
- @override
- void onResume(EventSink sink) => _windowSubscription?.resume();
-
- void maybeCreateWindow(S event, EventSink sink) {
- switch (_strategy) {
- // for example throttle
- case WindowStrategy.eventAfterLastWindow:
- if (_windowSubscription != null) return;
-
- _windowSubscription = singleWindow(event, sink);
-
- resolveWindowStart(event, sink);
-
- break;
- // for example scan
- case WindowStrategy.firstEventOnly:
- if (_windowSubscription != null) return;
-
- _windowSubscription = multiWindow(event, sink);
-
- resolveWindowStart(event, sink);
-
- break;
- // for example debounce
- case WindowStrategy.everyEvent:
- _windowSubscription?.cancel();
-
- _windowSubscription = singleWindow(event, sink);
-
- resolveWindowStart(event, sink);
-
- break;
- case WindowStrategy.onHandler:
- break;
- }
- }
-
- void maybeCloseWindow(EventSink sink) {
- if (_closeWindowWhen != null &&
- _closeWindowWhen!(UnmodifiableListView(queue))) {
- resolveWindowEnd(sink);
- }
- }
-
- StreamSubscription singleWindow(S event, EventSink sink) =>
- buildStream(event, sink).take(1).listen(
- null,
- onError: sink.addError,
- onDone: () => resolveWindowEnd(sink),
- );
-
- // opens a new Window which is kept open until the main Stream
- // closes.
- StreamSubscription multiWindow(S event, EventSink sink) =>
- buildStream(event, sink).listen(
- (dynamic _) => resolveWindowEnd(sink),
- onError: sink.addError,
- onDone: () => resolveWindowEnd(sink),
- );
-
- Stream buildStream(S event, EventSink sink) {
- Stream stream;
-
- _windowSubscription?.cancel();
-
- stream = _windowStreamFactory!(event);
-
- if (stream == null) {
- sink.addError(ArgumentError.notNull('windowStreamFactory'));
- }
-
- return stream;
- }
-
- void resolveWindowStart(S event, EventSink sink) {
- if (_onWindowStart != null) {
- sink.add(_onWindowStart!(event));
- }
- }
-
- void resolveWindowEnd(EventSink sink, [bool isControllerClosing = false]) {
- if (isControllerClosing ||
- _strategy == WindowStrategy.eventAfterLastWindow ||
- _strategy == WindowStrategy.everyEvent) {
- _windowSubscription?.cancel();
- _windowSubscription = null;
- }
-
- if (isControllerClosing && !_dispatchOnClose) {
- return;
- }
-
- if (_hasData && (queue.isNotEmpty || !_ignoreEmptyWindows)) {
- if (_onWindowEnd != null) {
- sink.add(_onWindowEnd!(List.unmodifiable(queue)));
- }
-
- // prepare the buffer for the next window.
- // by default, this is just a cleared buffer
- if (!isControllerClosing && _startBufferEvery > 0) {
- // ...unless startBufferEvery is provided.
- // here we backtrack to the first event of the last buffer
- // and count forward using startBufferEvery until we reach
- // the next event.
- //
- // if the next event is found inside the current buffer,
- // then this event and any later events in the buffer
- // become the starting values of the next buffer.
- // if the next event is not yet available, then a skip
- // count is calculated.
- // this count will skip the next Future n-events.
- // when skip is reset to 0, then we start adding events
- // again into the new buffer.
- //
- // example:
- // startBufferEvery = 2
- // last buffer: [0, 1, 2, 3, 4]
- // 0 is the first event,
- // 2 is the n-th event
- // new buffer starts with [2, 3, 4]
- //
- // example:
- // startBufferEvery = 3
- // last buffer: [0, 1]
- // 0 is the first event,
- // the n-the event is not yet dispatched at this point_bloc
- // skip becomes 1
- // event 2 is skipped, skip becomes 0
- // event 3 is now added to the buffer
- final startWith = (_startBufferEvery < queue.length)
- ? queue.sublist(_startBufferEvery)
- : [];
-
- skip = _startBufferEvery > queue.length
- ? _startBufferEvery - queue.length
- : 0;
-
- queue
- ..clear()
- ..addAll(startWith);
- } else {
- queue.clear();
- }
- }
- }
-}
-
-/// A highly customizable [StreamTransformer] which can be configured
-/// to serve any of the common rx backpressure operators.
-///
-/// The [StreamTransformer] works by creating windows, during which it
-/// buffers events to a [Queue].
-///
-/// The [StreamTransformer] works by creating windows, during which it
-/// buffers events to a [Queue]. It uses a [WindowStrategy] to determine
-/// how and when a new window is created.
-///
-/// onWindowStart and onWindowEnd are handlers that fire when a window
-/// opens and closes, right before emitting the transformed event.
-///
-/// startBufferEvery allows to skip events coming from the source [Stream].
-///
-/// ignoreEmptyWindows can be set to true, to allow events to be emitted
-/// at the end of a window, even if the current buffer is empty.
-/// If the buffer is empty, then an empty [List] will be emitted.
-/// If false, then nothing is emitted on an empty buffer.
-///
-/// dispatchOnClose will cause the remaining values in the buffer to be
-/// emitted when the source [Stream] closes.
-/// When false, the remaining buffer is discarded on close.
-class BackpressureStreamTransformer extends StreamTransformerBase {
- /// Determines how the window is created
- final WindowStrategy strategy;
-
- /// Factory method used to create the [Stream] which will be buffered
- final Stream Function(S event) windowStreamFactory;
-
- /// Handler which fires when the window opens
- final T Function(S event)? onWindowStart;
-
- /// Handler which fires when the window closes
- final T Function(List queue)? onWindowEnd;
-
- /// Used to skip an amount of events
- final int startBufferEvery;
-
- /// Predicate which determines when the current window should close
- final bool Function(List queue)? closeWindowWhen;
-
- /// Toggle to prevent, or allow windows that contain
- /// no events to be dispatched
- final bool ignoreEmptyWindows;
-
- /// Toggle to prevent, or allow the final set of events to be dispatched
- /// when the source [Stream] closes
- final bool dispatchOnClose;
-
- /// Constructs a [StreamTransformer] which buffers events emitted by the
- /// [Stream] that is created by [windowStreamFactory].
- ///
- /// Use the various optional parameters to precisely determine how and when
- /// this buffer should be created.
- ///
- /// For more info on the parameters, see [BackpressureStreamTransformer],
- /// or see the various back pressure [StreamTransformer]s for examples.
- BackpressureStreamTransformer(this.strategy, this.windowStreamFactory,
- {this.onWindowStart,
- this.onWindowEnd,
- this.startBufferEvery = 0,
- this.closeWindowWhen,
- this.ignoreEmptyWindows = true,
- this.dispatchOnClose = true});
-
- @override
- Stream bind(Stream stream) {
- var sink = _BackpressureStreamSink(
- strategy,
- windowStreamFactory,
- onWindowStart,
- onWindowEnd,
- startBufferEvery,
- closeWindowWhen,
- ignoreEmptyWindows,
- dispatchOnClose,
- );
- return forwardStream(stream, sink);
- }
-}
diff --git a/lib/app/utils/stream_ext/ext.dart b/lib/app/utils/stream_ext/ext.dart
deleted file mode 100644
index deb1cf9f8..000000000
--- a/lib/app/utils/stream_ext/ext.dart
+++ /dev/null
@@ -1,84 +0,0 @@
-import 'backpressure.dart';
-import 'timer_stream.dart';
-
-/// create by 张风捷特烈 on 2020/11/17
-/// contact me by email 1981462002@qq.com
-/// 说明:
-
-/// Transforms a [Stream] so that will only emit items from the source sequence
-/// if a window has completed, without the source sequence emitting
-/// another item.
-///
-/// This window is created after the last debounced event was emitted.
-/// You can use the value of the last debounced event to determine
-/// the length of the next window.
-///
-/// A window is open until the first window event emits.
-///
-/// The debounce [StreamTransformer] filters out items emitted by the source
-/// Stream that are rapidly followed by another emitted item.
-///
-/// [Interactive marble diagram](http://rxmarbles.com/#debounce)
-///
-/// ### Example
-///
-/// Stream.fromIterable([1, 2, 3, 4])
-/// .debounceTime(Duration(seconds: 1))
-/// .listen(print); // prints 4
-class DebounceStreamTransformer extends BackpressureStreamTransformer {
- /// Constructs a [StreamTransformer] which buffers events into a [List] and
- /// emits this [List] whenever the current [window] fires.
- ///
- /// The [window] is reset whenever the [Stream] that is being transformed
- /// emits an event.
- DebounceStreamTransformer(Stream Function(T event) window)
- : super(WindowStrategy.everyEvent, window,
- onWindowEnd: (Iterable queue) => queue.last) {
- assert(window != null, 'window stream factory cannot be null');
- }
-}
-
-/// Extends the Stream class with the ability to debounce events in various ways
-extension DebounceExtensions on Stream {
- /// Transforms a [Stream] so that will only emit items from the source sequence
- /// if a [window] has completed, without the source sequence emitting
- /// another item.
- ///
- /// This [window] is created after the last debounced event was emitted.
- /// You can use the value of the last debounced event to determine
- /// the length of the next [window].
- ///
- /// A [window] is open until the first [window] event emits.
- ///
- /// debounce filters out items emitted by the source [Stream]
- /// that are rapidly followed by another emitted item.
- ///
- /// [Interactive marble diagram](http://rxmarbles.com/#debounce)
- ///
- /// ### Example
- ///
- /// Stream.fromIterable([1, 2, 3, 4])
- /// .debounce((_) => TimerStream(true, Duration(seconds: 1)))
- /// .listen(print); // prints 4
- Stream debounce(Stream Function(T event) window) =>
- transform(DebounceStreamTransformer(window));
-
- /// Transforms a [Stream] so that will only emit items from the source
- /// sequence whenever the time span defined by [duration] passes, without the
- /// source sequence emitting another item.
- ///
- /// This time span start after the last debounced event was emitted.
- ///
- /// debounceTime filters out items emitted by the source [Stream] that are
- /// rapidly followed by another emitted item.
- ///
- /// [Interactive marble diagram](http://rxmarbles.com/#debounceTime)
- ///
- /// ### Example
- ///
- /// Stream.fromIterable([1, 2, 3, 4])
- /// .debounceTime(Duration(seconds: 1))
- /// .listen(print); // prints 4
- Stream debounceTime(Duration duration) => transform(
- DebounceStreamTransformer((_) => TimerStream(true, duration)));
-}
diff --git a/lib/app/utils/stream_ext/forwarding_stream.dart b/lib/app/utils/stream_ext/forwarding_stream.dart
deleted file mode 100644
index 1474f0215..000000000
--- a/lib/app/utils/stream_ext/forwarding_stream.dart
+++ /dev/null
@@ -1,82 +0,0 @@
-import 'dart:async';
-
-import 'backpressure.dart';
-
-// import 'package:rxdart/src/utils/forwarding_sink.dart';
-
-// import 'forwarding_sink.dart';
-
-/// @private
-/// Helper method which forwards the events from an incoming [Stream]
-/// to a new [StreamController].
-/// It captures events such as onListen, onPause, onResume and onCancel,
-/// which can be used in pair with a [ForwardingSink]
-Stream forwardStream(
- Stream stream,
- ForwardingSink connectedSink,
-) {
- ArgumentError.checkNotNull(stream, 'stream');
- ArgumentError.checkNotNull(connectedSink, 'connectedSink');
-
- late StreamController controller;
- late StreamSubscription subscription;
-
- void runCatching(void Function() block) {
- try {
- block();
- } catch (e, s) {
- connectedSink.addError(controller, e, s);
- }
- }
-
- final onListen = () {
- runCatching(() => connectedSink.onListen(controller));
-
- subscription = stream.listen(
- (data) => runCatching(() => connectedSink.add(controller, data)),
- onError: (dynamic e, StackTrace st) =>
- runCatching(() => connectedSink.addError(controller, e, st)),
- onDone: () => runCatching(() => connectedSink.close(controller)),
- );
- };
-
- final onCancel = () {
- final onCancelSelfFuture = subscription.cancel();
- final onCancelConnectedFuture = connectedSink.onCancel(controller);
- final futures = [
- if (onCancelSelfFuture is Future) onCancelSelfFuture,
- if (onCancelConnectedFuture is Future) onCancelConnectedFuture,
- ];
- return Future.wait(futures);
- };
-
- final onPause = ([Future? resumeSignal]) {
- subscription.pause(resumeSignal);
- runCatching(() => connectedSink.onPause(controller, resumeSignal!));
- };
-
- final onResume = () {
- subscription.resume();
- runCatching(() => connectedSink.onResume(controller));
- };
-
- // Create a new Controller, which will serve as a trampoline for
- // forwarded events.
- if (stream.isBroadcast) {
- controller = StreamController.broadcast(
- onListen: onListen,
- onCancel: onCancel,
- sync: true,
- );
- } else {
- controller = StreamController(
- onListen: onListen,
- onPause: onPause,
- onResume: onResume,
- onCancel: onCancel,
- sync: true,
- );
- }
-
- return controller.stream;
-}
diff --git a/lib/app/utils/stream_ext/timer_stream.dart b/lib/app/utils/stream_ext/timer_stream.dart
deleted file mode 100644
index 5d7ac42ee..000000000
--- a/lib/app/utils/stream_ext/timer_stream.dart
+++ /dev/null
@@ -1,56 +0,0 @@
-import 'dart:async';
-
-/// Emits the given value after a specified amount of time.
-///
-/// ### Example
-///
-/// TimerStream('hi', Duration(minutes: 1))
-/// .listen((i) => print(i)); // print 'hi' after 1 minute
-class TimerStream extends Stream {
- final StreamController _controller;
-
- /// Constructs a [Stream] which emits [value] after the specified [Duration].
- TimerStream(T value, Duration duration)
- : _controller = _buildController(value, duration);
-
- @override
- StreamSubscription listen(void Function(T event)? onData,
- {Function? onError, void Function()? onDone, bool? cancelOnError}) {
- return _controller.stream.listen(
- onData,
- onError: onError,
- onDone: onDone,
- cancelOnError: cancelOnError,
- );
- }
-
- static StreamController _buildController(T value, Duration duration) {
- if (duration == null) {
- throw ArgumentError('duration cannot be null');
- }
-
- late StreamSubscription subscription;
- late StreamController controller;
-
- controller = StreamController(
- sync: true,
- onListen: () {
- subscription =
- Stream.fromFuture(Future.delayed(duration, () => value)).listen(
- controller.add,
- onError: controller.addError,
- onDone: () {
- if (!controller.isClosed) {
- controller.close();
- }
- },
- );
- },
- onPause: ([Future? resumeSignal]) =>
- subscription.pause(resumeSignal),
- onResume: () => subscription.resume(),
- onCancel: () => subscription.cancel(),
- );
- return controller;
- }
-}
diff --git a/lib/app/utils/toly_utils.dart b/lib/app/utils/toly_utils.dart
deleted file mode 100644
index ea48a992e..000000000
--- a/lib/app/utils/toly_utils.dart
+++ /dev/null
@@ -1,3 +0,0 @@
-library toly_utils;
-export 'color_utils.dart';
-export 'random_provider.dart';
diff --git a/lib/app/views/about/about_app_page.dart b/lib/app/views/about/about_app_page.dart
deleted file mode 100644
index c40a9afc1..000000000
--- a/lib/app/views/about/about_app_page.dart
+++ /dev/null
@@ -1,227 +0,0 @@
-import 'package:flutter/cupertino.dart';
-/// create by 张风捷特烈 on 2020-04-13
-/// contact me by email 1981462002@qq.com
-/// 说明:
-
-import 'package:flutter/material.dart';
-import 'package:flutter_unit/app/res/toly_icon.dart';
-import 'package:flutter_unit/components/permanent/circle.dart';
-import 'package:flutter_unit/components/permanent/circle_image.dart';
-import 'package:flutter_unit/components/permanent/feedback_widget.dart';
-import 'package:flutter_unit/components/permanent/panel.dart';
-import 'package:url_launcher/url_launcher.dart';
-
-class AboutAppPage extends StatelessWidget {
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- backgroundColor: Colors.white,
- body: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Container(
- child: Stack(
- children: [
- Column(
- children: [
- Container(
- height: 150,
- width: MediaQuery.of(context).size.width,
- margin: EdgeInsets.only(bottom: 50),
- child: Image.asset(
- 'assets/images/sabar.webp',
- fit: BoxFit.cover,
- ),
- ),
- ],
- ),
- _buildBar(context),
- Positioned(
- bottom: 0,
- left: 50,
- child: CircleImage(
- size: 100,
- shadowColor: Theme.of(context).primaryColor,
- image: AssetImage('assets/images/icon_head.webp'),
- )),
- ],
- ),
- ),
- Expanded(
- child: SingleChildScrollView(
- child: Container(
- margin: EdgeInsets.all(24),
- child: _buildInfo(),
- ),
- ),
- ),
- ],
- ),
- );
- }
-
- Widget _buildBar(BuildContext context) {
- return Container(
- height: kToolbarHeight,
- margin: EdgeInsets.only(top: MediaQuery.of(context).padding.top),
- child: Row(
- children: [
- GestureDetector(
- onTap: () => Navigator.of(context).pop(),
- child: Container(
- padding: EdgeInsets.only(left: 10),
- child: Icon(
- Icons.arrow_back,
- size: 30,
- color: Theme.of(context).primaryColor,
- ),
- ),
- ),
- Spacer(),
- FeedbackWidget(
- onPressed: () =>
- _launchURL("mailto:1981462002@qq.com?subject=来自Flutter Unit"),
- child: Icon(
- TolyIcon.icon_email,
- size: 20,
- color: Theme.of(context).primaryColor,
- ),
- ),
- SizedBox(
- width: 20,
- )
- ],
- ),
- );
- }
-
- _launchURL(String url) async {
- if (await canLaunch(url)) {
- await launch(url);
- } else {
-
- }
- }
-
- Widget _buildInfo() {
- return Stack(
- children: [
- Positioned(
- right: 10,
- top: 0,
- child: Wrap(
- spacing: 20,
- children: [
- FeedbackWidget(
- onPressed: () =>
- _launchURL("https://github_model.com/toly1994328/FlutterUnit"),
- child: Wrap(
- direction: Axis.vertical,
- crossAxisAlignment: WrapCrossAlignment.center,
- children: [
- Icon(
- TolyIcon.icon_github,
- size: 35,
- ),
- Text('Github')
- ],
- )),
- ],
- ),
- ),
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text(
- 'Flutter Unit',
- style: TextStyle(fontSize: 30, fontWeight: FontWeight.bold),
- ),
- SizedBox(height: 20),
- Text(
- 'The Unity Of Flutter, The Unity Of Coder.',
- style: TextStyle(fontSize: 16),
- ),
- SizedBox(height: 10),
- Text(
- 'Flutter的联合,编程者的联合。',
- style: TextStyle(fontSize: 16),
- ),
- Divider(
- height: 20,
- ),
- InfoPanel(
- title: '项目简介',
- info: ' Flutter Unit 是一个非盈利性的开源项目,'
- '旨在提供全面的Flutter学习指南及编程者的交流技术的接口。'
- '由【张风捷特烈】提供技术支持和全权维护。唯一开源网站网址: '
- 'https://github_model.com/toly1994328/FlutterUnit',
- ),
- Divider(
- height: 20,
- ),
- InfoPanel(
- title: 'Flutter Unit 1.0',
- info: 'Flutter Unit 1.0 核心计划是收录widget,即widget集录。'
- '目前收录组件 283 个,均可在 app 中进行查看。'
- '项目中提供widget图鉴文件可供下载参考。功能主要如下:\n'
- '○ 280+的 Flutter 组件收录和详情介绍。\n'
- '○ 对一些重要的组件提供操作体验。\n'
- '○ link to功能,查看组件时可以切换到相关组件。\n'
- '○ 组件收藏和取消收藏功能。\n'
- '○ 主题、字体设置,代码风格等全局状态管理。\n'
- '○ 搜索功能和组件星级分类。',
- ),
- Divider(
- height: 20,
- ),
- InfoPanel(
- title: 'Flutter Unit 2.0 计划',
- info: 'Flutter Unit 2.0 尚在计划之中,如果说1.0是本王单枪匹马,'
- '那2.0将是Flutter爱好者的共同努力。后面陆续会发布一些征集方案,'
- '包括属性、布局、绘制、bug、要点集录等。吾想让Unit 成为一个Flutter的圣地,纯粹而强大,期待与你的共同携手。',
- )
- ],
- ),
- ],
- );
- }
-}
-
-class InfoPanel extends StatelessWidget {
- final String title;
- final String info;
-
-
- InfoPanel({required this.title,required this.info});
-
- @override
- Widget build(BuildContext context) {
- return Column(
- children: [
- Row(
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- Circle(color: Theme.of(context).primaryColor,), Padding(
- padding: const EdgeInsets.only(left: 15,top: 15,bottom: 15),
- child: Text('$title',style: TextStyle(fontSize: 16,fontWeight: FontWeight.bold),),
- )
- ],
- ),
- Panel(
- color: Theme.of(context).primaryColor.withAlpha(33),
- child: Text(
- '$info',
- style: TextStyle(color: Colors.grey,
- fontSize: 13,
- shadows: [
- Shadow(
- color: Colors.white,
- offset: Offset(1,1)
- )
- ]),
- ),
- ),
- ],
- );
- }
-}
diff --git a/lib/app/views/about/about_me_page.dart b/lib/app/views/about/about_me_page.dart
deleted file mode 100644
index de33c53f8..000000000
--- a/lib/app/views/about/about_me_page.dart
+++ /dev/null
@@ -1,206 +0,0 @@
-/// create by 张风捷特烈 on 2020-04-13
-/// contact me by email 1981462002@qq.com
-/// 说明:
-
-import 'package:flutter/material.dart';
-import 'package:flutter_unit/app/res/toly_icon.dart';
-import 'package:flutter_unit/components/permanent/circle_image.dart';
-import 'package:flutter_unit/components/permanent/feedback_widget.dart';
-import 'package:url_launcher/url_launcher.dart';
-
-class AboutMePage extends StatelessWidget {
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- backgroundColor: Colors.white,
- body: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Stack(
- children: [
- Column(
- children: [
- Container(
- height: 180,
- width: MediaQuery.of(context).size.width,
- margin: EdgeInsets.only(bottom: 50),
- child: Image.asset(
- 'assets/images/sabar.webp',
- fit: BoxFit.cover,
- ),
- ),
- ],
- ),
- _buildBar(context),
- Positioned(
- bottom: 0,
- left: 50,
- child: CircleImage(
- size: 100,
- shadowColor: Theme.of(context).primaryColor,
- image: AssetImage('assets/images/icon_head.webp'),
- )),
- ],
- ),
- Expanded(
- child: SingleChildScrollView(
- child: Container(
- margin: EdgeInsets.all(24),
- child: Stack(children: [
- Positioned(
- right: 10,
- top: 0,
- child: _buildLinkIcon(),
- ),
- _buildInfo()
- ]),
- ),
- ),
- ),
- ],
- ),
- );
- }
-
- Widget _buildBar(BuildContext context) {
- return Container(
- height: kToolbarHeight,
- margin: EdgeInsets.only(top: MediaQuery.of(context).padding.top),
- child: Row(
- children: [
- GestureDetector(
- onTap: () => Navigator.of(context).pop(),
- child: Container(
- padding: EdgeInsets.only(left: 10),
- child: Icon(
- Icons.arrow_back,
- size: 30,
- color: Theme.of(context).primaryColor,
- ),
- ),
- ),
- Spacer(),
- FeedbackWidget(
- onPressed: () =>
- _launchURL("mailto:1981462002@qq.com?subject=来自Flutter Unit"),
- child: Icon(
- TolyIcon.icon_email,
- size: 20,
- color: Theme.of(context).primaryColor,
- ),
- ),
- SizedBox(
- width: 20,
- )
- ],
- ),
- );
- }
-
- _launchURL(String url) async {
- if (await canLaunch(url)) {
- await launch(url);
- } else {
- debugPrint('Could not launch $url');
- }
- }
-
- Widget _buildInfo() {
- return Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text(
- '张风捷特烈',
- style: TextStyle(fontSize: 30, fontWeight: FontWeight.bold),
- ),
- SizedBox(height: 20),
- Text(
- 'The King Of Coder. 「编程之王」',
- style: TextStyle(fontSize: 16),
- ),
- SizedBox(height: 10),
- Text(
- '海的彼岸有我未曾见证的风采。',
- style: TextStyle(fontSize: 16),
- ),
- Divider(
- height: 18,
- ),
-
- Text(
- '微信群: 编程技术交流圣地-【Flutter群】\n'
- '愿青梅煮酒,与君天涯共话。',
- style: TextStyle(color: Colors.grey),
- ),
- SizedBox(height: 10),
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceEvenly,
- children: [
- Container(
- width: 190,
- child: Column(
- children: [
- Image.asset('assets/images/wechat.webp'),
- Text(
- '我的微信',
- style: TextStyle(fontSize: 16),
- ),
- ],
- ),
- ),
-// Container(
-// width: 160,
-// child: Column(
-// children: [
-// Image.asset('assets/images/wei_x.jpg'),
-// Text(
-// '请我喝茶(慎扫)',
-// style: TextStyle(fontSize: 16),
-// ),
-// ],
-// ),
-// ),
- ],
- ),
- ],
- );
- }
-
- Wrap _buildLinkIcon() {
- return Wrap(
- spacing: 20,
- children: [
- FeedbackWidget(
- onPressed: () =>
- _launchURL("https://juejin.im/user/5b42c0656fb9a04fe727eb37"),
- child: Wrap(
- direction: Axis.vertical,
- crossAxisAlignment: WrapCrossAlignment.center,
- children: [
- Icon(
- TolyIcon.icon_juejin,
- size: 35,
- color: Colors.blue,
- ),
- Text('掘金')
- ],
- )),
- FeedbackWidget(
- onPressed: () =>
- _launchURL("https://github_model.com/toly1994328"),
- child: Wrap(
- direction: Axis.vertical,
- crossAxisAlignment: WrapCrossAlignment.center,
- children: [
- Icon(
- TolyIcon.icon_github,
- size: 35,
- ),
- SizedBox(height: 4,),
- Text('Github')
- ],
- )),
- ],
- );
- }
-}
diff --git a/lib/app/views/about/version/app_version_checker.dart b/lib/app/views/about/version/app_version_checker.dart
deleted file mode 100644
index 5b11d36a6..000000000
--- a/lib/app/views/about/version/app_version_checker.dart
+++ /dev/null
@@ -1,169 +0,0 @@
-import 'dart:io';
-
-import 'package:dio/dio.dart';
-import 'package:flutter/cupertino.dart';
-import 'package:flutter/material.dart';
-
-import 'package:flutter_unit/app/utils/Toast.dart';
-import 'package:flutter_unit/app/utils/convert.dart';
-import 'package:flutter_unit/app/utils/http_utils/http_util.dart';
-import 'package:flutter_unit/app/utils/http_utils/result_bean.dart';
-import 'package:flutter_unit/point_system/api/app_info.dart';
-// import 'package:install_plugin/install_plugin.dart';
-import 'package:package_info/package_info.dart';
-import 'package:path/path.dart' as path;
-import 'package:path_provider/path_provider.dart';
-
-class AppVersionChecker extends StatefulWidget {
- const AppVersionChecker({Key? key}) : super(key: key);
-
- @override
- _AppVersionCheckerState createState() => _AppVersionCheckerState();
-}
-
-enum VersionState { none, loading, shouldUpdate, downloading }
-
-class _AppVersionCheckerState extends State {
- final TextStyle labelStyle = TextStyle(fontSize: 13);
- String oldVersion = '';
- String newVersion = '';
- int totalSize =0;
- String url = 'http://toly1994.com/file/FlutterUnit.apk';
- ValueNotifier versionState =
- ValueNotifier(VersionState.none);
-
- ValueNotifier progress = ValueNotifier(0);
-
- _doDownload() async {
- // Directory? dir = await getExternalStorageDirectory();
- // if(dir ==null) return;
- //
- // String dstPath = path.join(dir.path, 'FlutterUnit.apk');
- //
- // if(File(dstPath).existsSync()){
- // InstallPlugin.installApk(dstPath, 'com.toly1994.flutter_unit');
- // return;
- // }
-
- // versionState.value = VersionState.downloading;
- //
- // await HttpUtil.getInstance().client.download(url, dstPath,
- // onReceiveProgress: _onReceiveProgress,
- // options: Options(receiveTimeout: 24 * 60 * 60 * 1000));
- // versionState.value = VersionState.none;
- // InstallPlugin.installApk(dstPath, 'com.toly1994.flutter_unit');
- }
-
- void _onReceiveProgress(int count, int total) {
- totalSize = total;
- progress.value = count / total;
- }
-
- @override
- Widget build(BuildContext context) {
- return ListTile(
- title: Text('检查新版本', style: labelStyle),
- trailing: ValueListenableBuilder(
- valueListenable: versionState,
- builder: _buildTrailByState,
- ),
- onTap: () async {
- if (versionState.value == VersionState.shouldUpdate &&
- Platform.isAndroid) {
- _doDownload();
- return;
- }
-
- if (versionState.value == VersionState.downloading) {
- return;
- }
-
- versionState.value = VersionState.loading;
- ResultBean result = await AppInfoApi.getAppVersion();
- PackageInfo packageInfo = await PackageInfo.fromPlatform();
-
- if (result.status&&result.data!=null) {
- print('${result.data!.appName}:${result.data!.appVersion}');
- if (packageInfo.version == result.data!.appVersion) {
- Toast.success(context, '当前应用已是最新版本!');
- versionState.value = VersionState.none;
- } else {
- oldVersion = packageInfo.version;
- newVersion = result.data!.appVersion;
- Toast.green(context, '检测到新版本【${result.data!.appVersion}】,可点击更新!');
- versionState.value = VersionState.shouldUpdate;
- }
- } else {
- print('${result.msg}');
- versionState.value = VersionState.none;
- }
- },
- );
- }
-
- Widget _buildTrailByState(
- BuildContext context, VersionState value, Widget? child) {
- switch (value) {
- case VersionState.none:
- return const SizedBox();
- case VersionState.loading:
- return const CupertinoActivityIndicator();
- case VersionState.shouldUpdate:
- return Wrap(
- alignment: WrapAlignment.center,
- crossAxisAlignment: WrapCrossAlignment.center,
- children: [
- Text(
- '$oldVersion --> $newVersion ',
- style: TextStyle(height: 1, fontSize: 12, color: Colors.grey),
- ),
- const SizedBox(
- width: 5,
- ),
- const Icon(
- Icons.update,
- color: Colors.green,
- )
- ]);
- case VersionState.downloading:
- return ValueListenableBuilder(
- valueListenable: progress, builder: _buildProgress);
- }
- return const SizedBox();
- }
-
- Widget _buildProgress(BuildContext context, double value, Widget? child) {
- return Wrap(
- alignment: WrapAlignment.center,
- crossAxisAlignment: WrapCrossAlignment.center,
- children: [
- Column(
- children: [
- Text(
- '${(value * 100).toStringAsFixed(2)} %',
- style: TextStyle(height: 1, fontSize: 12, color: Colors.grey),
- ),
- const SizedBox(
- height: 5,
- ),
- Text(
- '${Convert.convertFileSize((totalSize * value).floor())}/${Convert.convertFileSize(totalSize)}',
- style: TextStyle(height: 1, fontSize: 10, color: Colors.grey),
- ),
- ],
- ),
- const SizedBox(
- width: 15,
- ),
- SizedBox(
- width: 20,
- height: 20,
- child: CircularProgressIndicator(
- strokeWidth: 2,
- backgroundColor: Colors.grey,
- value: value,
- ),
- )
- ]);
- }
-}
diff --git a/lib/app/views/about/version/version_shower.dart b/lib/app/views/about/version/version_shower.dart
deleted file mode 100644
index f29e75ae5..000000000
--- a/lib/app/views/about/version/version_shower.dart
+++ /dev/null
@@ -1,32 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:package_info/package_info.dart';
-
-class VersionShower extends StatefulWidget {
- const VersionShower({Key? key}) : super(key: key);
-
- @override
- _VersionShowerState createState() => _VersionShowerState();
-}
-
-class _VersionShowerState extends State {
- String version = '1.0.0';
-
- @override
- void initState() {
- super.initState();
- _fetchVersion();
- }
-
- @override
- Widget build(BuildContext context) {
- return Text('Version $version');
- }
-
- void _fetchVersion() async{
- PackageInfo packageInfo = await PackageInfo.fromPlatform();
- if(mounted)
- setState(() {
- version= packageInfo.version;
- });
- }
-}
diff --git a/lib/app/views/about/version_info.dart b/lib/app/views/about/version_info.dart
deleted file mode 100644
index 1f0ca5196..000000000
--- a/lib/app/views/about/version_info.dart
+++ /dev/null
@@ -1,125 +0,0 @@
-
-import 'package:flutter/material.dart';
-
-import 'package:flutter_unit/app/res/style/behavior/no_scroll_behavior.dart';
-import 'package:flutter_unit/app/router/unit_router.dart';
-
-import 'package:flutter_unit/components/permanent/circle_image.dart';
-import 'package:flutter_unit/components/permanent/feedback_widget.dart';
-import 'package:url_launcher/url_launcher.dart';
-
-import 'version/app_version_checker.dart';
-import 'version/version_shower.dart';
-
-/// create by 张风捷特烈 on 2020/6/16
-/// contact me by email 1981462002@qq.com
-/// 说明:
-
-class VersionInfo extends StatelessWidget {
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- backgroundColor: Colors.white,
- appBar: AppBar(
- backgroundColor: Colors.white,
- elevation: 0,
- iconTheme: IconThemeData(
- color: Colors.grey
- ),
- ),
- body:ConstrainedBox(
- constraints: BoxConstraints.expand(),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- Padding(
- padding: const EdgeInsets.only(top:28.0),
- child: _buildTop(),
- ),
-
- _buildCenter(context),
- Spacer(),
- Padding(
- padding: const EdgeInsets.only(bottom:8.0),
- child: buildBottom(),
- )
-
- ],
- ),
- ),
- );
- }
-
- Widget _buildTop() {
- return Wrap(
- direction: Axis.vertical,
- crossAxisAlignment: WrapCrossAlignment.center,
- spacing: 10,
- children: [
- CircleImage(image: AssetImage("assets/images/icon_head.webp"),size: 80,),
- Text('Flutter Unit',style: TextStyle(fontSize: 20,fontWeight: FontWeight.bold),),
- const VersionShower(),
- ],
- );
- }
-
- Widget _buildCenter(BuildContext context) {
- final labelStyle= TextStyle(fontSize: 13);
- return Padding(
- padding: const EdgeInsets.only(left:20.0,right: 20,top: 20),
- child: ScrollConfiguration(
- behavior: NoScrollBehavior(),
- child: ListView(
- shrinkWrap: true,
- children: [
- Divider(height: 1,),
- ListTile(
- title: Text('应用详情',style: labelStyle,),
- trailing: _nextIcon(context),
- onTap: () => Navigator.of(context).pushNamed(UnitRouter.about_app),
- ),
- Divider(height: 1,indent: 10),
- const AppVersionChecker(),
- Divider(height: 1,indent: 10),
- ListTile(
- title: Text('检查数据库新版本',style: labelStyle),
- trailing: _nextIcon(context),
- onTap: () async{
-
- },
- ),
- Divider(height: 1,),
- ],
- ),
- ),
- );
- }
-
- Widget _nextIcon(BuildContext context) =>
- Icon(Icons.chevron_right, color: Colors.grey);
-
- Widget buildBottom() {
- return Wrap(
- direction: Axis.vertical,
- crossAxisAlignment: WrapCrossAlignment.center,
- spacing: 4,
- children: [
- FeedbackWidget(
- onPressed: (){
- _launchURL("https://github_model.com/toly1994328/FlutterUnit");
- },
- child: Text('《查看本项目Github仓库》',style: TextStyle(fontSize: 12,color: Color(0xff616C84),),)),
- Text('Power By 张风捷特烈',style: TextStyle(fontSize: 12,color: Colors.grey),),
- Text('Copyright © 2008-2020 Toly1994',style: TextStyle(fontSize: 12,color: Colors.grey),),
- ],
- );
- }
-
- _launchURL(String url) async {
- if (await canLaunch(url)) {
- await launch(url);
- } else {
-
- }
- }
-}
diff --git a/lib/app/views/data_manage/data_manage_page.dart b/lib/app/views/data_manage/data_manage_page.dart
deleted file mode 100644
index e9639111d..000000000
--- a/lib/app/views/data_manage/data_manage_page.dart
+++ /dev/null
@@ -1,147 +0,0 @@
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:flutter/material.dart';
-import 'package:flutter/services.dart';
-import 'package:flutter_bloc/flutter_bloc.dart';
-
-import 'package:flutter_unit/app/res/toly_icon.dart';
-import 'package:flutter_unit/app/utils/Toast.dart';
-import 'package:flutter_unit/app/utils/http_utils/result_bean.dart';
-import 'package:flutter_unit/point_system/api/category_api.dart';
-
-import 'package:flutter_unit/widget_system/repositories/model/category_model.dart';
-import 'package:flutter_unit/widget_system/repositories/repositories.dart';
-
-import 'package:flutter_unit/user_system/component/authentic_widget.dart';
-import 'package:flutter_unit/widget_system/blocs/widget_system_bloc.dart';
-import 'package:path/path.dart' as path;
-import 'package:sqflite/sqflite.dart';
-
-/// create by 张风捷特烈 on 2021/2/26
-/// contact me by email 1981462002@qq.com
-/// 说明:
-///
-
-class DataManagePage extends StatelessWidget {
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- appBar: AppBar(
- title: const Text('数据管理'),
- ),
- body: Builder(
- builder: (ctx) => ListView(
- children: [
- AuthenticWidget.just(
- ListTile(
- trailing: Icon(
- TolyIcon.upload,
- color: Theme.of(context).primaryColor,
- ),
- title: const Text('备份收藏集数据'),
- onTap: () => _doUploadCategoryData(ctx),
- ),
- ),
- AuthenticWidget.just(Divider()),
- AuthenticWidget.just(ListTile(
- trailing: Icon(
- TolyIcon.download,
- color: Theme.of(context).primaryColor,
- ),
- title: const Text('同步收藏集数据'),
- onTap: () => _doSync(ctx),
- )),
- AuthenticWidget.just(Divider()),
- ListTile(
- trailing: Icon(
- Icons.refresh,
- color: Theme.of(context).primaryColor,
- ),
- title: const Text('收藏集数据重置'),
- // trailing: _nextIcon(context),
- onTap: () => _recallDatabase(ctx),
- ),
- Divider(),
- ],
- ),
- ),
- );
- }
-
- _recallDatabase(BuildContext context) async {
- String databasesPath = await getDatabasesPath();
- String dbPath = path.join(databasesPath, "flutter.db");
- ByteData data = await rootBundle.load(path.join("assets", "flutter.db"));
- List bytes =
- data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
- await File(dbPath).writeAsBytes(bytes, flush: true);
- print("==== debug ===== assets ======拷贝完成====");
- BlocProvider.of(context).add(EventLoadCategory());
- BlocProvider.of(context).add(EventLoadLikeData());
- Toast.toast(context, '重置成功!');
- }
-
- void _doUploadCategoryData(BuildContext context) async {
- CategoryRepository rep = BlocProvider.of(context).repository;
- List loadCategories = await rep.loadCategoryData();
-
- List likeData = await LocalDb.instance.likeDao.likeWidgetIds();
-
- String json = jsonEncode(loadCategories);
- String likeJson = jsonEncode(likeData);
-
- ResultBean result =
- await CategoryApi.uploadCategoryData(data: json, likeData: likeJson);
-
- if (result.status) {
- Toast.toast(context, '数据集备份成功!');
- } else {
- Toast.toast(context, '数据集备份失败!');
- }
- }
-
- void _doSync(BuildContext context) async {
- ResultBean result = await CategoryApi.getCategoryData();
-
- if (result.status) {
- // 说明请求成功
- if (result.data != null) {
- //说明有后台备份数据,进行同步操作
- CategoryRepository repository =
- BlocProvider.of(context).repository;
- await repository.syncCategoryByData(
- result.data!.data, result.data!.likeData);
- BlocProvider.of(context).add(EventLoadCategory());
- BlocProvider.of(context).add(EventLoadLikeData());
- } else {
- // 说明还没有后台数据,
- // 这里防止有傻孩子没点备份,就点同步,哥哥好心,给备份一下。
- CategoryRepository rep =
- BlocProvider.of(context).repository;
- List loadCategories = await rep.loadCategoryData();
- List likeData = await LocalDb.instance.likeDao.likeWidgetIds();
-
- String json = jsonEncode(loadCategories);
- String likeJson = jsonEncode(likeData);
- await CategoryApi.uploadCategoryData(data: json, likeData: likeJson);
- }
- Toast.toast(context, '数据同步份成功!');
- } else {
- Toast.toast(context, '数据同步份失败!');
- }
- }
-}
-
-// class LoadingIndicate extends StatefulWidget {
-// Future Function task;
-// @override
-// _LoadingIndicateState createState() => _LoadingIndicateState();
-// }
-//
-// class _LoadingIndicateState extends State {
-// @override
-// Widget build(BuildContext context) {
-// return Container();
-// }
-// }
diff --git a/lib/app/views/navigation/bloc_wrapper.dart b/lib/app/views/navigation/bloc_wrapper.dart
deleted file mode 100644
index 179c83449..000000000
--- a/lib/app/views/navigation/bloc_wrapper.dart
+++ /dev/null
@@ -1,80 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_bloc/flutter_bloc.dart';
-import 'package:flutter_unit/app/blocs/global/global_bloc.dart';
-import 'package:flutter_unit/app/blocs/global/global_event.dart';
-import 'package:flutter_unit/point_system/blocs/point_system_bloc.dart';
-import 'package:flutter_unit/widget_system/repositories/repositories.dart';
-import 'package:flutter_unit/user_system/bloc/authentic/bloc.dart';
-import 'package:flutter_unit/user_system/bloc/authentic/event.dart';
-import 'package:flutter_unit/user_system/bloc/login/bloc.dart';
-import 'package:flutter_unit/user_system/bloc/register/bloc.dart';
-
-import 'package:flutter_unit/widget_system/blocs/widget_system_bloc.dart';
-
-
-
-/// create by 张风捷特烈 on 2020/4/28
-/// contact me by email 1981462002@qq.com
-/// 说明: Bloc提供器包裹层
-
-final AppStart storage = AppStart();
-
-class BlocWrapper extends StatefulWidget {
- final Widget child;
-
- BlocWrapper({required this.child});
-
- @override
- _BlocWrapperState createState() => _BlocWrapperState();
-}
-
-class _BlocWrapperState extends State